<?php

use Illuminate\Database\Seeder;
use App\User;

class TasksTableSeeder extends Seeder
{

    /**
     * Auto generated seed file
     *
     * @return void
     */
    public function run()
    {
        $tasks = array (
            0 =>
                array (
                    'id' => 1,
                    'title' => '码之初',
                    'content' => '<ul>
<li>你好,欢迎加入千里码,我们旨在提升每一个到来的coder的编程水平。在这里你可以了解其他coder在各大公司会用到的各种通用技能，也可以通过查阅学习资料去掌握这些技能。</li>
<li>作为一个coder,首先需要掌握一门最最最基本的编程语言以及一些数学常识。</li>
<li>我们希望您现在已经掌握了一门编程语言的基本用法。</li>
<li>第2333个能被2或者被3整除的正整数是…?请把答案填入答题框内…如果有问题请点击右侧按钮查阅题目相关讨论区。 举例:(被2或者被3整除的正整数依次是：2,3,4,6,8,9,10,12,14,15,16,18…)</li>
</ul>',
                    'answer' => '3500',
                    'material' => '程序的本质是逻辑与算法,算法的本质是数学。希望各位在IT界摸爬滚打的同时,练好基本功,深挖洞,广积粮。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-28 14:14:47',
                    'updated_at' => '2016-04-25 17:25:02',
                    'author' => 'han.ze@qq.com',
                    'x' => 500,
                    'y' => 180,
                    'contributor' => 1,
                    'study' => '123',
                    'score' => 100,
                ),
            1 =>
                array (
                    'id' => 2,
                    'title' => '自由之门',
                    'content' => '<ul><li><p>从学习的角度来说，翻墙主要是为了更方便地使用google，wiki，查阅那些最新的，还未被翻译成中文的技术文档。</p></li><li><p>现在国内程序员遇到的编程问题，可能国内只有少数人遇到，因此很多的中文社区无法第一时间解答你的问题。在stackoverflow,github等社区往往能找到你需要的答案。因此我们是非常希望各位能有良好的英语阅读能力和翻墙能力，第一时间了解来自于全世界业界的动向。</p></li><li><p>下面这个链接（需翻墙）<a target="_blank" href="https://www.google.com.hk/?hl=en#safe=strict&hl=en&q=great+wall+of+china">https://www.google.com.hk/?hl=en#safe=strict&hl=en&q=great+wall+of+china</a><br>本题答案，就是该google结果页面中，第一条搜索结果最终指向的链接。</p></li></ul>',
                    'answer' => 'https://en.wikipedia.org/wiki/Great_Wall_of_China',
                    'material' => '生命诚可贵,爱情价更高,若为自由故,两者皆可抛。让我们像电影勇敢的心的主角一样高喊:freedom!!!',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-28 14:25:55',
                    'updated_at' => '2016-04-25 17:26:09',
                    'author' => 'han.ze@qq.com',
                    'x' => 550,
                    'y' => 210,
                    'contributor' => 7,
                    'study' => '123',
                    'score' => 100,
                ),
            2 =>
                array (
                    'id' => 3,
                    'title' => 'English',
                    'content' => '<p>It is hard to code if you do know English, it is even harder if you don\'t; most documentation is written in English, as are most libraries, almost every piece of code you come into contact with will be written using English keywords, and be described in English. Most online courses are only available in English. Most conferences have presentations only spoken in English. Written word is easy enough to translate, but media such as images with text, and audio/video are much harder. Without understanding English, you are depriving yourself of a huge amount of learning resources.
You don\'t need to be Shakespeare, but you do need a basic grasp of the language. If you don\'t know English, you\'re not a programmer. If you comprehend that, you will know the answer of this task is "to learn more English".</p>',
                    'answer' => 'to learn more English',
                    'material' => '作为一个程序员,你可以看不懂c,可以看不懂java,但你不能看不懂英语。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-28 11:57:11',
                    'updated_at' => '2016-04-25 17:26:09',
                    'author' => 'han.ze@qq.com',
                    'x' => 500,
                    'y' => 280,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 100,
                ),
            3 =>
                array (
                    'id' => 4,
                    'title' => 'get & post',
                    'content' => '<ul>
<li>get和post是html中最常用的两种方法,无论是网站注册,在知乎发表文章,在淘宝浏览购买商品,在千里码上看题答题…都离不开get和post.</li>
<li>这题的答案是:restful,但是只接受post的请求的提交哦</li>
</ul>',
                    'answer' => 'restful',
                    'material' => 'post&get,予给予求',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-23 04:25:29',
                    'updated_at' => '2016-04-25 17:26:09',
                    'author' => '82638883@163.com',
                    'x' => 430,
                    'y' => 240,
                    'contributor' => 8,
                    'study' => '',
                    'score' => 100,
                ),
            4 =>
                array (
                    'id' => 5,
                    'title' => '访客统计',
                    'content' => '<ul>
<li>每一个网站都会根据访客日志统计访客数据，比如<a target="_blank" href="http://baike.baidu.com/link?url=p3UPX9OnmtX8RuzWoYsuz_clFkG_bzJp9jtYN7c5Q5jU_N4vVT_F6hUP5zSisxr8e12x1ZcHjTfdU2IRlhx7CYBnxalADDn3cAUdvV9ZXvG">UV</a>。UV能够回答一个关键的市场营销问题：“到底有多少人（潜在客户）看到了你发布的信息（即网站）。</li>
<li>下面根据题目给出的某购物网站<a target="_blank" href="http://www.qlcoder.com//download/uv.txt">访问日志</a>，统计当天该网站UV。日志文件的每一行代表一次访问行为，每行分别包含三项，用户访问的时间，用户的id，用户的行为。请问8月24号当天，该网站有多少个用户访问了。</li>
</ul>',
                    'answer' => '57856',
                    'material' => '互联网公司最最最关心的数据:uv,没有之一',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 15:26:20',
                    'updated_at' => '2016-04-25 17:26:09',
                    'author' => 'han.ze@qq.com',
                    'x' => 450,
                    'y' => 330,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 113,
                ),
            5 =>
                array (
                    'id' => 6,
                    'title' => 'IP',
                    'content' => '<p>本题答案为本网站的<a target="_blank" href="https://zh.wikipedia.org/wiki/IP%E5%9C%B0%E5%9D%80">IP地址</a>。</p>',
                    'answer' => '121.201.63.168',
                    'material' => 'Bill Gates在写windows的时候说640K内存对于任何人来说都足够了,Jon Postel在定义ipv4的时候说ip地址的数量够全世界用几百年了...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-24 13:29:27',
                    'updated_at' => '2016-04-25 17:26:09',
                    'author' => 'han.ze@qq.com',
                    'x' => 532,
                    'y' => 352,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 100,
                ),
            6 =>
                array (
                    'id' => 7,
                    'title' => 'cookie',
                    'content' => '<ul>
<li>当你所建网站需要登录时，为方便用户二次登录，会记录其cookie，使用户在二次登录时，默认把用户的登录账号填好，或者把账号密码都填写好，甚至直接是登录状态。<a target="_blank" href="https://zh.wikipedia.org/wiki/Cookie">cookie</a>指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据（通常经过加密）。cookie也是可以清除的，浏览器提供了这一功能，如图<img src="http://121.201.63.168/uploads/82716.png" alt=""  style="width:100%;"/></li>
<li>这题的答案已经存在了你的cookie里了哦~</li>
</ul>',
                    'answer' => 'oreo',
                    'material' => 'cookie 之所以叫做cookie,因为它像饼干一样干脆利落^_^',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-23 08:04:20',
                    'updated_at' => '2016-04-25 17:26:09',
                    'author' => '82638883@163.com',
                    'x' => 374,
                    'y' => 216,
                    'contributor' => 8,
                    'study' => '',
                    'score' => 117,
                ),
            7 =>
                array (
                    'id' => 8,
                    'title' => '数据脱敏',
                    'content' => '<p>当你在建网站的时候，往往需要保存用户的账号密码，由于直接存下用户的明文密码是非常不安全的，大名鼎鼎的csdn曾经就因为被黑客爬了数据库，导致<a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2011-03692">600w用户的信息外泄</a>。密码竟然是明文!!! 用户信息加密去除敏感信息是一个网站开发者的基本功，这里最常用的加密方式当然是md5啦~这里提供一个<a target="_blank" href="http://tool.chinaz.com/Tools/MD5.aspx">md5加密网站</a>。</p>
<p>由于一次攻击事件,黑客拿到了@shinian的32位经过md5处理后的密码 7E38890B870934B126F66857ED6B57B9,
shinian又是一个很喜欢用8位生日数字作为密码的人…糟糕,好像知道了什么呢！
这题的答案就是shinian的密码明文..</p>',
                    'answer' => '19900406',
                    'material' => '一切以明码存放用户隐私数据的行为全都是耍流氓= =!',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-23 04:59:38',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => '82638883@163.com',
                    'x' => 314,
                    'y' => 194,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 149,
                ),
            8 =>
                array (
                    'id' => 9,
                    'title' => ' sql注入-1',
                    'content' => '<ul>
<li>sql注入攻击是很多网站都会遇到的问题。</li>
<li>作为一个小心翼翼的开发者，是有能力100%避免类似事情发生的。比如对用户提交的表单数据进行正则验证。</li>
<li>由于@shinian是一个web开发新手，没有太多的网站开发经验，这是@shinian的网站<a target="_blank" href="http://www.qlcoder.com/train/admin">后台管理员登陆页面</a>。管理员的账号是shinian。答案就是后台里哦。</li>
</ul>',
                    'answer' => 'c3p0',
                    'material' => '任何黑帽白帽的必备生存技能...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-23 12:14:09',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => '82638883@163.com',
                    'x' => 263,
                    'y' => 147,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 192,
                ),
            9 =>
                array (
                    'id' => 10,
                    'title' => 'Basic CSS',
                    'content' => '<p><p>CSS 指层叠样式表 (Cascading Style Sheets)，当前所有的主流浏览器均支持层叠样式表。</p><br><p>样式表极大地提高了工作效率。</p><br><p>样式表定义了如何显示 HTML 元素，就像 HTML 3.2 的字体标签和颜色属性所起的作用那样。样式通常保存在外部的 .css 文件中。通过仅仅编辑一个简单的 CSS 文档，外部样式表使你有能力同时改变站点中所有页面的布局和外观。</p><br><p>由于允许同时控制多重页面的样式和布局，CSS 可以称得上 WEB 设计领域的一个突破。作为网站开发者，你能够为每个 HTML 元素定义样式，并将之应用于你希望的任意多的页面中。如需进行全局的更新，只需简单地改变样式，然后网站中的所有元素均会自动地更新。</p><br><hr /><br><p>接下来，请将<a target="_blank" href="http://www.qlcoder.com/uploads/46477.html">网页</a>（如网页出现乱码，请将浏览器编码设置为UTF-8）中的两个黑框位置依次修改为32px 161px;49px 40px。</p><br><p>请将两个黑色背景图像框内文字直接写在答题框内。</p></p>',
                    'answer' => '哈坤',
                    'material' => '不要以为ios和android火了css就没用了,html5会杀回来的呢！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 15:48:37',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => 'han.ze@qq.com',
                    'x' => 420,
                    'y' => 173,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 137,
                ),
            10 =>
                array (
                    'id' => 11,
                    'title' => '跑马灯',
                    'content' => '<p>在各个电商网站（淘宝，京东，唯品会，蘑菇街等等等等）的大促期间，经常会需要各种抽奖活动刺激用户消费。
而这些花花绿绿的抽奖活动（抽奖大转盘，跑马灯等，主要基本是由javascript编写的）。下面是一个js写的跑马灯的<a target="_blank" href="http://121.201.63.168/uploads/63343.html">demo</a>,看看各位的运气如何，能不能抽到大奖通过此题呢？</p>',
                    'answer' => 'Brendan Eich',
                    'material' => 'node.js已经把js提升到了一个新的高度了',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-19 11:27:17',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => '82638883@163.com',
                    'x' => 351,
                    'y' => 119,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 181,
                ),
            11 =>
                array (
                    'id' => 12,
                    'title' => '商品数量-1',
                    'content' => '<ul>
<li>当在天猫购物，使用关键词搜索商品时，可以选择很多附选条件，比如品牌，价格等，之后会出现符合当前条件的商品及数量，如图，搜索词为：羽绒服，附选条件为：价格¥500-¥1000<img src="http://www.qlcoder.com/uploads/44906.png" alt=""  style="width:100%;"/></li>
<li>主页陈列出符合条件的商品，以及一个商品数量（见右上角），但商品数量会因为商家上架、下架商品而改变，因此买家在不同时间段搜索商品时，显示的数量会不一样。</li>
<li>接下来包含一个含有多行的<a href="http://www.qlcoder.com/download/144043123647536.txt">文本文件</a>，文件的每行代表上架，下架，查询三种行为的一种，本题默认查询对象是‘衣服’。</li>
<li>请计算所有买家查询结果的总和。
<hr />
<ul>
<li>举例: 一个拥有6行的文件。
<ul>
<li>up 3 11       （有一个商家上架了3件11rmb的衣服。）</li>
<li>query 11 25    (有一个买家查询11rmb-25rmb的衣服的数量。这里的查询结果是:3件)</li>
<li>up 5 25     （有一个商家上架了5件25rmb的衣服。）</li>
<li>query 11 25    (有一个买家查询11rmb-25rmb的衣服的数量。这里的查询结果是:8件)</li>
<li>down 3 25  （有一个商家下架了3件25rmb的衣服。）</li>
<li>query 20 25 （有一个买家查询20rmb-25rmb的衣服的数量。这里的查询结果是:2件）</li>
</ul></li>
<li>这题的答案是所有买家查询结果的总和为13（3+8+2=13）。</li>
</ul></li>
</ul>',
                    'answer' => '360268',
                    'material' => '搜索和条件查询永远是电商网站的必备组件',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-24 15:55:08',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => 'han.ze@qq.com',
                    'x' => 385,
                    'y' => 305,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 267,
                ),
            12 =>
                array (
                    'id' => 13,
                    'title' => '商品数量-2',
                    'content' => '<ul>
<li>本题与‘商品数量-1’题型一致，仅改变文本文件。</li>
<li>请下载本题<a href="http://121.201.63.168/download/144043063958496.txt">文本文件</a>，计算所有买家查询结果的总和。</li>
</ul>',
                    'answer' => '3334590479',
                    'material' => '当数据量大到一定程度之后,遇到的问题就完完全全的不一样了',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-24 15:55:38',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => 'han.ze@qq.com',
                    'x' => 303,
                    'y' => 363,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 355,
                ),
            13 =>
                array (
                    'id' => 14,
                    'title' => '热点营销-1',
                    'content' => '<ul>
<li>在当前的IT环境中，引流成本是非常昂贵的，一个电商网站获取1个用户的成本一般在0.7-1.0rmb左右，一个游戏就更高啦~因此，如何以最低的消耗获得流量是每个互联网公司都会面临的问题。</li>
<li>其中有一种非常低廉的营销手段就是通过微信的朋友圈，制造热点话题，疯狂转发。比如前阵子大名鼎鼎的爆红小游戏<a target="_blank" href="http://baike.baidu.com/link?url=zXb_MjOE4YSnAdJKiSwmiFZX9CeSs5SOhNhYLpZ6bd5czX21xHTKWslW_Mhfe8W_tdHQezBi_rlkji_ZkqfP4K">神经猫</a>,创下了在3天内被访问了1亿次的记录。</li>
<li>对于营销来说，选取合适的种子用户传播是非常关键的。比如对于微博的大v营销。如果公司的预算只够请得起2个大v传播广告，那么请（姚晨，姚明）的选择明显好于请（姚晨，范冰冰）。因为（姚晨，范冰冰的粉丝基本一致，而姚明和姚晨是跨界的，粉丝交集没那么多）。</li>
<li>现在的问题来了，这是100个微信用户的<a href="http://qlcoder.com/download/144047638844506.txt">关系列表</a>（为了方便表达，把名字变成一个整数,这100个用户的名字分别为1-100，每行有两个名字，代表这两人互为微信好友），你需要使一个广告让这100个微信用户都看到，请问初始至少将这条广告传播个几个人？（这条广告编写得很精美，因此用户们看到一定会转发在他的朋友圈让他的朋友看到的）。</li>
</ul>
<hr />
<pre><code> 举例：下面是7个人的关系列表，问小明若要使A信息完全覆盖这7个人，初始至少要传播给几个人？
假设7个人A,B,C,D,E,F,G
A和B是好友
B和C是好友
C和D是好友
E和F是好友
G由于性格怪癖没有朋友。
那么小明至少要将A信息传播给3个人，才能让这7个人都能收到热点消息（A,B,C,D中的一个，E,F中的一个，外加G）。答案为3。</code></pre>',
                    'answer' => '1',
                    'material' => '各大互联网公司的品牌宣传部,流量推广部每年的预算基本都是员工工资开销的数倍甚至数十倍。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-25 04:33:07',
                    'updated_at' => '2016-04-25 17:26:10',
                    'author' => 'han.ze@qq.com',
                    'x' => 367,
                    'y' => 389,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 450,
                ),
            14 =>
                array (
                    'id' => 15,
                    'title' => '热点营销-2',
                    'content' => '<ul>
<li>本题与‘热点营销-1’题型一致，仅改变微信用户数量（100000）和<a href="http://121.201.63.168/download/144341511030664.txt">关系列表</a>。</li>
<li>请问，若需要使一个广告让这100000个微信用户都看到，请问初始至少将这条广告传播个几个人？</li>
</ul>',
                    'answer' => '16161',
                    'material' => '腾讯的关系链路是上亿级别的,大家可以通过这题感受下。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 15:56:57',
                    'updated_at' => '2016-04-25 17:26:12',
                    'author' => 'han.ze@qq.com',
                    'x' => 300,
                    'y' => 443,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 662,
                ),
            15 =>
                array (
                    'id' => 16,
                    'title' => '断点续传',
                    'content' => '<ul>
<li>用户经常使用迅雷的客户端软件下载文件，有时候会在下载时遇到网络故障，或者其他原因不能继续下载文件。但之后你重新打开迅雷客户端软件，可以从已经下载的部分开始继续下载未完成的部分，而没有必要从头开始上传下载。用户可以节省时间，提高速度。该功能为<a target="_blank" href="http://baike.baidu.com/link?url=UMTbX9jASgepCpRMzKfreCtZa9MSUFz7QkxkeQFM5iaPflwsKAhiIGXFXQ_3Ho-My5jyhlyCir5toUFtAt3QQK">断点续传</a>。</li>
<li>如图，可以直接从35%之后继续下载。<img src="http://121.201.63.168/uploads/144050908972994.png" alt=""  style="width:100%;"/></li>
<li>这里有一个大小为100G的<a target="_blank" href="http://www.qlcoder.com/download/hugefile">文件</a>，答案在该文件的第12345678901byte至12345678999byte,千万不要从头开始下载哦</li>
</ul>',
                    'answer' => 'content-range',
                    'material' => '你们还记得当年的网际快车和网络蚂蚁么...?',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 06:00:42',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'han.ze@qq.com',
                    'x' => 490,
                    'y' => 410,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 291,
                ),
            16 =>
                array (
                    'id' => 17,
                    'title' => '我从哪里来',
                    'content' => '<p>HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
Referer其实应该是英文单词Referrer，不过拼错的人太多了，所以编写标准的人也就将错就错了。
关于HTTP Referer使用非常简单，使用场合比较多的是用于页面统计、资源防<a target="_blank" href="http://baike.baidu.com/link?url=MnXgukwYSqW1aN__gG6gf-pHfODiFATM6DLj6FPtLuU5877aGWD-6_wCIry6ZY5xkDs8u9vaSIgDXpxyP6iKMq">盗链</a>等。</p>
<p>这题的答案非常简单，是\'referer\',但是只有来自于<a target="_blank" href="http://cpc.people.com.cn/">我党官网</a>的用户才有资格提交哦！</p>',
                    'answer' => 'referer',
                    'material' => '我是谁?我从哪里来?我要到哪里去? 这不仅仅只是人生三问',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-25 11:31:30',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 605,
                    'y' => 430,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 273,
                ),
            17 =>
                array (
                    'id' => 18,
                    'title' => '彩虹',
                    'content' => '<p>彩虹</p>
<ul>
<li>
<p>色彩对网站的重要程度不言而喻。淘宝网全站的黄色基调不是偶尔，因为黄色能刺激人类的购买消费欲望哦~
同样的网站不同的配色能给人完全不一样的感觉。最近非常流行的秘密花园,就是靠各种不同的配色获得完全不同的视觉效果而流行起来的，欣赏一下吧^_^
<img src="http://121.201.63.168/uploads/74024.jpg" alt=""  style="width:100%;"/></p>
</li>
<li>了解色彩的基本原理是非常有必要的。</li>
<li>那么问题来了,下面这张图片是一张纯色图片。这题的答案就是这张图片色彩的<a target="_blank" href="http://baike.baidu.com/link?url=TztBLUOWqcHIhPfGpoAC2yApmiMB3uzj7EBCgOOK_GYzSZRM6axChdAb8FVKXD5V_TU3dheU9x87JN1ksgoeAq">rgb</a>值。（答案格式:100-212-312,三个数字分别代表red,green,blue分量的色彩）</li>
<li><img src="http://121.201.63.168/uploads/61244.jpg" alt="" style="width:100%;"/></li>
</ul>',
                    'answer' => '179-223-230',
                    'material' => '这题对熟练使用qq的同学来说只需要一首歌的时间,我来送大家一首歌~',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-24 08:14:33',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 572,
                    'y' => 317,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 112,
                ),
            18 =>
                array (
                    'id' => 19,
                    'title' => '以图搜图-1',
                    'content' => '<ul>
<li><a target="_blank" href="http://baike.baidu.com/link?url=EqfiuineybUYDuJdNuNjboUpFkFTYhmvI5wxHC758Sm4ABZVNEBM_edp-WsSN-ZCiCWMTj5DF-8bq2r5FSHiVK">以图搜图</a>已成为一种新的搜索趋势；各大搜索引擎厂商均推出了使用图片搜索的功能，以图搜图主要应用在以下两方面：</li>
<li>1、同款比价购物搜索引擎：目前全球使用这种方式的网站有：<a target="_blank" href="http://baike.baidu.com/view/4853905.htm">安图搜</a>，用户可以通过上传图片进行全网同款或者相似商品的搜索和比价。</li>
<li>2、图片搜索：目前有<a target="_blank" href="http://shitu.baidu.com/">百度识图</a>、<a target="_blank" href="http://pic.sogou.com/">搜狗</a>、<a target="_blank" href="http://www.google.cn/intl/zh-CN/insidesearch/features/images/searchbyimage.html">谷歌</a>等网站，用户通过上传图片进行全网同图片或者相似图片的搜索。</li>
<li>请查询下面图片中人物，本题答案即为该人物名字。</li>
<li><img src="http://121.201.63.168/uploads/144056295283397.jpg" alt=""  style="width:100%;"/></li>
</ul>',
                    'answer' => '王小波',
                    'material' => '放这张照片,就是希望不要荒废了自己的黄金时代,这算不算一个大大的hint呢',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 05:36:55',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'han.ze@qq.com',
                    'x' => 637,
                    'y' => 352,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 149,
                ),
            19 =>
                array (
                    'id' => 20,
                    'title' => '字符识别',
                    'content' => '<ul>
<li>现在中小学生群体中有一款很风靡的软件——<a target="_blank" href="http://www.zybang.com/">作业帮</a>，app中有一个功能叫做拍照搜题，学生可以通过拍照的方式，将问题发到作业帮进行搜索，答案秒出。</li>
<li>拍照搜题中不可或缺的技术是<a target="_blank" href="http://baike.baidu.com/link?url=yS6j-GZcTUS06c7FOjvj8v4gGcdP2iz3_3M8Rmm4bZQqDRcZU7gtGW80x0rBOIgidi5wGHyObGTjegr1ttxb3gHSiajTRhfGKB-7YdBNa2MpsoR72ytjAZCmonMAkkj8">光学字符识别</a>。</li>
<li>这里有一个<a target="_blank" href="http://qlcoder.com/download/cap1.7z">压缩文件夹</a>，里面有10000张含有英文单词的图片，其中一个英文单词出现了两遍，本题答案即为该英文字单词。</li>
</ul>',
                    'answer' => 'none',
                    'material' => '如果你做出了这题，并且本身不是图形图像专业了,千里码团队非常欢迎你的加入',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 16:18:35',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'han.ze@qq.com',
                    'x' => 700,
                    'y' => 397,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 4166,
                ),
            20 =>
                array (
                    'id' => 21,
                    'title' => '文件管理',
                    'content' => '<ul>
<li>文件管理是操作系统中一项重要的功能。其重要性在于，在现代计算机系统中，用户的程序和数据，操作系统自身的程序和数据，甚至各种输出输入设备，都是以文件形式出现的。</li>
<li>而在日常使用计算机时，会产生很多垃圾（以文件的形式存在，如碎片），导致计算机运行速度降低。之后就出现了很多诸如电脑管家，360卫士之类的软件出现，清理这些垃圾碎片，如图：<img src="http://121.201.63.168/uploads/144171557552189.jpg" alt=""  style="width:100%;"/></li>
<li>这里需要将这些垃圾归类，并计算其大小，之后根据用户需求删除或继续保留。</li>
<li>这里有一个<a href="http://www.qlcoder.com/download/root.rar">文件夹</a>，答案就在里面最大的text文档里面。</li>
</ul>',
                    'answer' => 'Total Commander',
                    'material' => '依稀记得大学时候的各种放小片片的文件夹,都叫做“党的先进性教育” “中日友好关系发展”。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-26 16:31:16',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'han.ze@qq.com',
                    'x' => 637,
                    'y' => 275,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 189,
                ),
            21 =>
                array (
                    'id' => 22,
                    'title' => 'git',
                    'content' => '<p>当你不再一个人战斗的时候，需要一些协作工具帮助你和你的战友们去维护代码。oh…千万别把这件事想得太简单了。大名鼎鼎的<a target="_blank" href="http://baike.baidu.com/link?url=s0UnNcCHLuaEoKbnOin2vZyq41iXa2wfscaZ3IviGu6aHpgDR7324z0fkY6d1m1Lajq9lDngk6I3j5QC3cpLKK">svn</a> 也没能完美的解决这个问题。但是..git的诞生把协同提升到了一个新的高度，目前世界最大的开源社区<a target="_blank" href="https://github.com/">github</a>就是基于git的。
<p>在我的实际工作中，git是必备组件，我曾去过3家公司，亲身经历了从svn向git的转型。其实一开始，我是拒绝的，因为svn用得好好的，没事学一个新玩意，还是有学习成本的…但当我感受了git的分支切换以秒级速度完成之后…我就开始享受它所带来的效率和美好了。</p>
<p>出这道题，我衷心的希望大家能去了解和接触git&github。</p>
<p>这里是oreo托管在github上的一个<a target="_blank" href="https://github.com/qlcoder-oreo/welcome2git">开源项目</a> ，里面只有一个基本的项目介绍文件 Readme.md。如果你已经有了github账号，请fork该项目，并在自己的分支中更改此文件,添加你在千里码社区的用户名，当你把你的修改合并回主干的时候，该题会被设为通过。（目前merge主要是人工操作，由于需要merge的比较多，工作量较大。后期发现git提交的username之后直接该题设为通过，而不merge到主干了。周知)</p>',
                    'answer' => 'oreo is a option dog',
                    'material' => 'git是linux作者为了维护linux代码,花了两周时间独立完成的...真是随随便便改变世界的节奏啊...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-10 10:25:55',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 525,
                    'y' => 245,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 233,
                ),
            22 =>
                array (
                    'id' => 23,
                    'title' => '爬虫-1',
                    'content' => '<p>google，baidu的两大技术：爬虫&搜索。爬虫负责抓取整个互联网的内容，搜索负责生成索引供用户检索。so~爬虫算是google的看家本领了…</p>
<p>但是google和百度的爬虫技术基本是不公开的，算是商业机密了…360搜索刚起步的时候第一件事就是挖百度的核心搜索爬虫组的coder，基本是3倍工资起挖…(跪求360公司来辟谣)。</p>
<p><a target="_blank" href="http://nutch.apache.org/">nutch</a> 是一个开源的爬虫框架，如果对这方面技术有兴趣的话可自行google、baidu进行更深入的了解。</p>
<p>接下来我会以一系列题目教会大家一个网络爬虫的核心技术点。</p>
<p>首先要会的是通过get请求实现一个最最最简单的爬虫爬取基本的网页信息。</p>
<p>电影是伟大的艺术（烂片除外）</p>
<p><a target="_blank" href="http://movie.douban.com/top250">豆瓣电影top250</a>收录了至今为止，大家最最最喜欢的250部电影。</p>
<p>该列表呈现了每部电影的评分，年份等基本信息。</p>
<p>这题的答案很简单，我想知道这个榜单的前166部电影的评分总和。</p>
<p>举例:：目前排第一的肖申克的救赎 9.6分，第二的这个杀手不太冷 9.4分，第三的阿甘正传 9.4分。前3部电影的总分=9.6+9.4+9.4=28.4。</p>',
                    'answer' => '1466.3',
                    'material' => '360刚起步的时候，爬虫的效率很低，导致对被爬的网站负担很大。有次我正在吃夜宵，运维组的哥们电话打给我：哥们快回来！我们被ddos攻击了…赶紧上线查日志…发现360的爬虫在我们网站的一些动态页面死循环了…连忙打电话给360…仍然挂了1个月的KPI…360还钱！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-10 18:36:37',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'han.ze@qq.com',
                    'x' => 560,
                    'y' => 415,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 350,
                ),
            23 =>
                array (
                    'id' => 24,
                    'title' => '爬虫-2',
                    'content' => '<p>你现在应该已经掌握了基本的爬去网页的方式了。</p>
<p>接下来，向你介绍大名鼎鼎的<a target="_blank" href="http://baike.baidu.com/link?url=mBOSLRbTczx7xvj6hfuoazX5Sm4GfLZiy8xFaxLFpKca-NQqR7coMI9j4vzyrhu3VR2xuX_MMkqZbTlda9A32a">robots协议</a>，现在很多公司和机构都需要爬虫收集互联网的信息。</p>
<p>曾经，360爬取百度的搜索内容，被百度状告违反robots协议…</p>
<p>曾经，百度做<a target="_blank" href="http://baike.baidu.com/view/1909861.htm">有啊商城</a>，百度爬虫被淘宝直接禁止…</p>
<p>商业&道德…其实很多是个伪命题。</p>
<p>这是一个秘密的<a target="_blank" href="http://www.qlcoder.com/train/secret">网页</a>…禁止了所有其他爬虫…只接受<a target="_blank" href="http://baike.baidu.com/link?url=a0VC8rY_kdPP9QgtZXZDTNQBfuV0TiTv_5LM4LSEmjny8hh5C-ENHZ__H641SOzGR-lFQ6SEXAEHbf6FjE9Kbq">HTTP USER AGENT</a>是qlcoder spider的用户，答案就在这个秘密的网页中。</p>',
                    'answer' => 'Robots Exclusion Protocol',
                    'material' => '无论是web1.0还是web2.0,都是内容为王...很多网站的价值本源就是『信息以更高效的形式聚合』。重点是聚合,不是产生...怎么聚合呢...当然是靠爬虫啦...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-10 22:53:12',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'han.ze@qq.com',
                    'x' => 588,
                    'y' => 485,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 444,
                ),
            24 =>
                array (
                    'id' => 25,
                    'title' => '老王装货',
                    'content' => '<p><img src="http://121.201.63.168/uploads/144308611691002.png" alt="" /></p>
<p>顺丰速运，全货机专机运输，提供高效的便捷服务，更快更安全!</p>
<p>首先，是快捷的时效服务。自有专机和400余条航线的强大航空资源以及庞大的地面运输网络，保障客户的快递在各环节最快发运。　</p>
<p>其次，是安全的运输服务。顺丰速运自营的运输网络，给消费者提供标准、高质、安全的服务。</p>
<p>由此，顺丰速运在消费者的心中留下了完美的形象，从而提高了企业的业绩，也奠定了其在整个快递领域中的基础。</p>
<p>顺丰快递每天能收到成千上万的物流单，每个物流单的重量不一。
现在顺丰快递的货车司机隔壁老王开着顺丰的标配货车（<strong>限载5吨</strong>，含5吨，不考虑限高）,想要<strong>一次性拿走尽可能重的货物</strong>，这些货有红木沙发，有钢材等等。</p>
<p>以下是货物清单：</p>
<table>
<thead>
<tr>
<th>货物编号</th>
<th>货物重量(单位:kg)</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>509</td>
</tr>
<tr>
<td>2</td>
<td>838</td>
</tr>
<tr>
<td>3</td>
<td>924</td>
</tr>
<tr>
<td>4</td>
<td>650</td>
</tr>
<tr>
<td>5</td>
<td>604</td>
</tr>
<tr>
<td>6</td>
<td>793</td>
</tr>
<tr>
<td>7</td>
<td>564</td>
</tr>
<tr>
<td>8</td>
<td>651</td>
</tr>
<tr>
<td>9</td>
<td>697</td>
</tr>
<tr>
<td>10</td>
<td>649</td>
</tr>
<tr>
<td>11</td>
<td>747</td>
</tr>
<tr>
<td>12</td>
<td>787</td>
</tr>
<tr>
<td>13</td>
<td>701</td>
</tr>
<tr>
<td>14</td>
<td>605</td>
</tr>
<tr>
<td>15</td>
<td>644</td>
</tr>
</tbody>
</table>
<p>请在答题框下输入你想装运的货物的编号，用“-”分隔。</p>
<pre><code>比如1-2-3代表同时装入编号为1,2,3的货物，此时货物总重为509（1号货物）+838（2号货物）+924（3号货物）=2271kg,远小于限载额——5吨，隔壁老王会被吐槽的。。。
比如1-5-8-9-11-12-14代表同时装入编号为1,5,8,9，11,12,14的货物，此时货物总重为509（1号货物）+604（5号货物）+651（8号货物）+697（9号货物）747（11号货物）+787（12号货物）+605（14号货物）=4600kg，这时与限载额——5吨，就比较接近了，隔壁老王会很高兴。。。</code></pre>',
                    'answer' => 'oreo is a option dog',
                    'material' => '欢迎各位千里码们加入顺丰,全国快递业龙头,估值320亿哟...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-24 11:31:22',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'vct_han@163.com',
                    'x' => 580,
                    'y' => 120,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 100,
                ),
            25 =>
                array (
                    'id' => 26,
                    'title' => '爬虫-3',
                    'content' => '<p>各大网站的更新速度是千差万别的。因此作为一个通用的爬虫，对每个网站的爬去频率肯定不是都一样的，需要针对每个网站的更新频率的做动态调整。</p>
<p>当搜索引擎刚开始收录某个网站的时候，可以设置初始的爬取时间是4天/次，如果这两次间发现网站有更新，接下去可以2天/次的频率爬去…如果又发现有更新，可以以1天/次…反之就加长时间…因此，无论你是一个非常实时的新闻快讯网站，还是每月一更的小说连载网站，最终爬虫都可以以和网站更新频率相仿的频率进行爬取，达到资源利用的最大化。</p>
<p>接下来有10个网页，分别编号为1、2、3、4、5、6、7、8、9、10，每个网页都会以固定的频率不断的更新内容。如编号为1的网页更新频率为1秒/次，编号为2的网页更新频率为3秒/次，大家可以点击下面的前2个链接,感受下更新速度。</p>
<ol>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/1">www.qlcoder.com/train/spider3/1</a></li>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/2">www.qlcoder.com/train/spider3/2</a></li>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/3">www.qlcoder.com/train/spider3/3</a></li>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/4">www.qlcoder.com/train/spider3/4</a></li>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/5">www.qlcoder.com/train/spider3/5</a></li>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/6">www.qlcoder.com/train/spider3/6</a></li>
<li><a target="_blank" href="http://www.qlcoder.com/train/spider3/7">www.qlcoder.com/train/spider3/7</a></li>
<li><a target="_blank"  href="http://www.qlcoder.com/train/spider3/8">www.qlcoder.com/train/spider3/8</a></li>
<li><a target="_blank"  href="http://www.qlcoder.com/train/spider3/9">www.qlcoder.com/train/spider3/9</a></li>
<li><a target="_blank"  href="http://www.qlcoder.com/train/spider3/10">www.qlcoder.com/train/spider3/10</a></li>
</ol>
<p>请将这10个网页根据更新的频率，从高到低排序…中间用分隔符"-"分开。（ps：建议正在攻克本题的coder，访问间隔大于5秒，<font color="red">爬取速度过快明显超过题目需求的会被暂时封ip</font>）</p>
<pre><code>（如1-3-5-7-9-2-4-6-8-10，表示编号为1的网页的更新频率最高，其次是编号为3的网页，再其次为编号为5的网页。。。以此类推，更新频率最低的是编号为10的网页）</code></pre>',
                    'answer' => '1-2-10-9-6-5-4-3-7-8',
                    'material' => '网站更新频率以及爬虫抓取频率的匹配程度,是一个搜索引擎公司很重要的技术指标...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-25 22:08:05',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'vct_han@163.com',
                    'x' => 556,
                    'y' => 464,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 970,
                ),
            26 =>
                array (
                    'id' => 27,
                    'title' => '我要建站-1',
                    'content' => '<p>你已经玩了很久的千里码啦…其实建设自己的网站并不难…尤其是现在虚拟主机和云厂商越来越多，价格也越来越低廉…建站的成本其实是非常小的。千里码团队强烈推荐<a target="_blank"  href="http://www.qingcloud.com">青云</a> 、<a target="_blank"  href="http://www.aliyun.com/">阿里云</a>。千里码就是架设在青云之上的。</p>
<p>在这里，千里码团队希望你能建设自己的网站，请提供一个url（即在答案框内输入你制作的网页的url），这个url无须申请特定的域名，使用ip地址即可，但所定向的网页内容必须包含，且仅包含你个人的用户名，字符编码请用UTF-8。</p>
<p>例，这个链接：<a target="_blank"  href="http://121.201.63.168/shinian.html">http://121.201.63.168/shinian.html</a> ，其网页内容包含且仅包含shinian的用户名… 因此shinian可以提交的答案是 "http://121.201.63.168/shinian.html"</p>
<p>PS: 网页内容不能有任何html标签</p>',
                    'answer' => 'oreo is a option dog',
                    'material' => '本来我想说点有意义的话的...但是qingcloud的工程师把刀架在我脖子上让我打广告:  青云是国内一家非常技术向的云服务提供商,资源完全弹性计算秒级响应..是目前国内唯一一家能叫板aws的...技术秒杀阿里云腾讯云...就是价格嘛...贵了1丢丢...你也是知道的...我们这种高冷的技术向,是不屑于和阿里腾讯打价格战的。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-27 10:36:21',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'vct_han@163.com',
                    'x' => 461,
                    'y' => 152,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 320,
                ),
            27 =>
                array (
                    'id' => 28,
                    'title' => '我要建站-2',
                    'content' => '<p>恭喜你能解锁此题，这说明你已经有了自己的静态站点了，但是静态站点的功能是非常有限的。千里码团队希望你可以了解jsp，asp，php三种架设动态站点的技术中的一种。</p>
<p>请提供一个url（即在答案框内输入你制作的网页的url，网页字符编码请用UTF-8），这个url能接收两个参数a和b，返回a*b的值。</p>
<p>比如当a=4,b=5的时候,你应该返回20,为了便于你的理解...</p>
<p>这里提供两个返回a+b的例子:(实际上需要的是a*b!!!)</p>
<ul>
<li><a target="_blank"  href="http://121.201.63.168/train/plus?a=3&b=4">http://121.201.63.168/train/plus?a=3&b=4</a>，这个url能接收两个参数a和b，返回a+b的值，此时参数a=3，b=4，返回a+b的值为7</li>
<li><a target="_blank"  href="http://121.201.63.168/train/plus?a=3&b=6">http://121.201.63.168/train/plus?a=3&b=6</a>，这个url能接收两个参数a和b，返回a+b的值，此时参数a=3，b=6，返回a+b的值为9</li>
</ul>
<p>这里你提交的答案不需要带参数,只需提交: http://121.201.63.168/train/plus 即可…</p>',
                    'answer' => 'oreo is a option dog',
                    'material' => 'qingcloud的工程师把刀架在我脖子上让我接着打广告: 青云内置缓存集群redis,关系型数据库mysql,菲关系型数据库mongodb..让整个建站过程非常简易,配置化.并且您无需担心数据的容灾,备份等各种异常情况,qingcloud强大的技术支撑,总之就是一个字:屌屌屌..',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-27 10:36:56',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'vct_han@163.com',
                    'x' => 430,
                    'y' => 107,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 478,
                ),
            28 =>
                array (
                    'id' => 29,
                    'title' => 'sql注入-2',
                    'content' => '<p>由于@shinian是一个web开发新手，没有太多的网站开发经验，所以在sql注入-1中，他的网站被其他coder轻易攻破了，所以……</p>
<p>他被扣了三个月的奖金！</p>
<p>他被扣了三个月的奖金！</p>
<p>他被扣了三个月的奖金！</p>
<p>重要的事情要说三遍…</p>
<p><br></p>
<p>经此一役，shinian同学洗心革面，发奋图强，终于脱胎换骨。这是shinian同学经过苦心修炼sql防注入大法之后的新的后台管理页面，点击进入<a target="_blank" href="http://www.qlcoder.com/train/admin2">后台管理员登陆页面</a>，管理员的账号同样是shinian。</p>',
                    'answer' => 'dangersqlmap',
                    'material' => '盲注算不算是sql注入的最高境界呢...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-28 00:45:38',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'vct_han@163.com',
                    'x' => 204,
                    'y' => 130,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 3703,
                ),
            29 =>
                array (
                    'id' => 30,
                    'title' => '逆向工程-begin',
                    'content' => '<h3>逆向工程专栏系列</h3>
<p>大家好,我是飞虎,曾在我党体制的公安机关从事网络安全的工作。
在我的学习和工作过程中,经常会用到很多逆向工具…包括c++,jar包,flash,android等等…
目前逆向工程是国外基础教学的一个非常大的分支，包括逆向工程，反逆向工程，运用面非常之广。</p>
<ul>
<li>曾经instagram推出滤镜大受欢迎后,国内的360包括美图秀秀均用类似基于去研究国外的竞争对手。</li>
<li>华为早期持续靠逆向思科的产品起家,才有了今天的华为帝国。</li>
</ul>
<p>因此我在这里会以每周的频率定期更新逆向工程相关的技术和知识。前期以task的形式给出，后续会
补上学习资料…
另外欢迎大家加入我党，加入体制内,目前国内公安体系越来越重视互联网技术,想成为有关部门么？想查水表么？
可以联系我哦…
最后放一个大大的徽章,希望大家不要做坏事哦。
<img src="http://121.201.63.168/uploads/144344742453777.jpg" alt=""  style="width:100%;"/></p>
<p>这里是一个<a target="_blank" href="http://www.qlcoder.com/maeda.swf">swf格式的小游戏</a>…非常的精美和优雅…
玩通关之后就能看到答案了…</p>',
                    'answer' => '156145',
                    'material' => '目前国内的互联网公司还没有非常的开发，开源，分享，因此有着非常多的『商业机密』,其实逆向工程远比你想像得运用面还要广很多。

PS:如果你徒手玩通关这个游戏...请联系我收下我的膝盖...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-28 21:41:46',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 780,
                    'y' => 245,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 641,
                ),
            30 =>
                array (
                    'id' => 31,
                    'title' => '正则表达式',
                    'content' => '<p>各大电商&金融理财类公司,比如支付宝,往往会拥有用户的实名信息以及身份证信息。</p>
<p>这些真实的用户信息能产生巨大的商业价值。可进行定向的广告 or 商品 or 理财产品的个性化推送…
比如刚工作的年轻人可能大部分是月光族,因此比较合适推送 免息的月结的小额贷款。
但是对于大于35岁的用户来说,高利息的定期存款业务往往更适合。</p>
<p>现在某金融公司打造了1个比较适合年轻男性的理财产品:国庆无息贷款双人游,非常适合1985-1995年(包括1985,不包括1995)之间的年轻男性…</p>
<p>当然这是需要很多用户相关的数据,简单起见.我们只需要匹配出出生年份在1985-1995的男性用户的身份证号..</p>
<p>这里的身份证均为18位身份证号的新版身份证…关于如何根据身份证号识别性别和年龄,可以查看这个<a target="_blank" href="http://zhidao.baidu.com/link?url=b8Yqy6gcfV6aJIg_OoEHq2SREpyrcp1TsADB9YlCkPuKoXsR-RVhZxZUW5eZkf5p0XRxZWOJNLf9V_vx02kVNa
">链接</a></p>
<p>举例:</p>
<ul>
<li>220422197205148440这个身份证号(当然这个是假的),这代表一个出生年份是1972年的女性,不符合要求</li>
<li>654201199306252458这个身份证号(当然也是个假的),这代表一个出生年份是1993年的男性,符合要求</li>
</ul>
<p>正则表达式经过多年的演化，现在最主要有三种标准:</p>
<ol>
<li>基本的正则表达式（Basic Regular Expression 又叫 Basic RegEx  简称 BREs）</li>
<li>扩展的正则表达式（Extended Regular Expression 又叫 Extended RegEx 简称 EREs）</li>
<li>Perl 的正则表达式（Perl Regular Expression 又叫 Perl RegEx 简称 PREs）</li>
</ol>
<p>目前比较通用的是Extended Regular Expression,其中</p>
<ul>
<li>shell的<a target="_blank" href="http://baike.baidu.com/view/1057278.htm">grep</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=xW6mkw24DMXRibohAmNBekF1AWcfGsqvL8gqYTvjiW8IF_bmKYdZWQtcDfRPD4rd89_nzkdc_-cmRncflItJ5_">awk</a></li>
<li><a target="_blank" href="http://baike.baidu.com/subview/432091/13657254.htm">sed</a></li>
<li>php中的<a target="_blank" href="http://php.net/manual/zh/function.mb-ereg.php">mb_ereg</a></li>
<li>java的<a target="_blank" href="http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html">java.util.regex.Pattern</a> </li>
</ul>
<p>均以EREs为标准。</p>
<p>现在你的task就是写一个正则表达式来匹配这些符合要求的身份证号（出生年份在1985-1995的男性用户）并提交这个正则表达式.</p>
<ul>
<li>提交的正则不需要转义...举例如果需要匹配3个数字,提交 [\\d]{3} 即可,不需要提交 [\\\\d]{3} </li>
</ul>',
                    'answer' => 'oreo is a option dog',
                    'material' => '和字符串打交道就一定离不开正则表达式~',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-29 13:39:13',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 450,
                    'y' => 380,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 352,
                ),
            31 =>
                array (
                    'id' => 32,
                    'title' => '同图搜索-1',
                    'content' => '<p>图片搜索是图形图像学非常重要的一块，同图搜索是图片搜索的基础。</p>
<p>可能大家会想：相同图片有什么好搜的呢?直接把图片文件md5之后比对不就完事了么? too young too simple！！</p>
<p>以下内容这只是一个简单的例子，面对真实的运用场景，往往还要复杂很多。</p>
<p>但是我希望大家可以理解和掌握这个基本的同图搜索的方式。</p>
<p>我在这里给大家做个介绍：下面这位是图形图像界的女神 <a target="_blank" href="http://baike.baidu.com/link?url=xVIX8BRtTtuey4tTsz6BQHUAqcn-I1CE7lLvjYKC0EoaNBPHps3h17hL1ya7eLAnmEZCjV313_ZDSSg5_i7Rqa">lenna</a></p>
<h6>lenna 256*256标准版</h6>
<p><img src="http://121.201.63.168/uploads/144360517232532.png" alt="" /></p>
<h6>lenna 256*256变暗版</h6>
<p><img src="http://121.201.63.168/uploads/144360527147848.png" alt="" /></p>
<h6>lenna 256*256高亮版</h6>
<p><img src="http://121.201.63.168/uploads/144360530484667.png" alt="" /></p>
<h6>lenna 128*128标准版</h6>
<p><img src="http://121.201.63.168/uploads/144360536793466.png" alt="" /></p>
<h6>lenna 64*64标准版</h6>
<p><img src="http://121.201.63.168/uploads/144360539417294.png" alt="" /></p>
<h6>lenna 32*32标准版</h6>
<p><img src="http://121.201.63.168/uploads/144360543487853.png" alt="" /></p>
<h6>lenna 16*16标准版</h6>
<p><img src="http://121.201.63.168/uploads/144360547856146.png" alt="" /></p>
<p>还有包括lenna.jpg，lenna.bmp版本等等等。。。</p>
<p>以上几张图本质上是一张，但是由于由于图片的格式、大小、明暗的不同，md5文件完全是没有用的！
那怎么识别这些图本质上是同一张图呢?
<strong><em>一种比较通俗易懂的方法是把图片hash成一段指纹，这个指纹和图片的大小、格式、明暗均无关，只和图片的内容本身有关。</em></strong></p>
<p>在这里我做一个简要的入门。</p>
<h4>1.先把彩色图片转为灰度图</h4>
<p>如果原本的一个像素点的rgb值为(r1,g1,b1)，一个比较简易的方法转为灰度图，</p>
<p>就是 gray1=(r1*299+g1*587+b1*114+500)/1000</p>
<p>那么该像素点的rgb颜色变为(gray1,gray1,gray1)。</p>
<p>实际的效果如图所示：</p>
<h6>lenna 256*256 灰度版</h6>
<p><img src="http://121.201.63.168/uploads/144360558257910.png" alt="" /></p>
<h4>2.将灰度图转化为黑白图</h4>
<p>先计算出该图的平均灰度，一种比较简易的做法是把所有像素点的灰度求和平均。
然后对于每个像素点，如果小于平均灰度，则rgb值为(0,0,0)，否则为(255,255,255)。
经过这一步，图片就变成黑白的了。</p>
<p>实际的效果如图所示：</p>
<h6>lenna 256*256 黑白版</h6>
<p><img src="http://121.201.63.168/uploads/144360818440282.png" alt="" /></p>
<h4>3. 将黑白图缩放为8*8</h4>
<h6>lenna 128*128</h6>
<p><img src="http://121.201.63.168/uploads/144361874071845.png" alt="" /></p>
<h6>lenna 64*64</h6>
<p><img src="http://121.201.63.168/uploads/144361840888965.png" alt="" /></p>
<h6>lenna 32*32</h6>
<p><img src="http://121.201.63.168/uploads/144361867767276.png" alt="" /></p>
<h6>lenna 16*16</h6>
<p><img src="http://121.201.63.168/uploads/144361845580379.png" alt="" /></p>
<h5>lenna 8*8</h5>
<p><img src="http://121.201.63.168/uploads/144361858390179.png" alt="" /></p>
<h4>4 编码</h4>
<p>ok，现在我们把最终8*8的黑白版放大看看</p>
<p><img src="http://121.201.63.168/uploads/144361893728412.jpg" alt="" /></p>
<h6>白色为0，黑色为1 8行8列进行编码</h6>
<ul>
<li>01000001 </li>
<li>01100001</li>
<li>01100010</li>
<li>01010100</li>
<li>00110100</li>
<li>01011100</li>
<li>11010101</li>
<li>11110011</li>
</ul>
<h6>整合到一起就是1个64位的2进制</h6>
<p>01000001011000010110001001010100010111001101010111110011</p>
<h6>转化成16进制</h6>
<p>416162545cd5f4</p>
<p>因此，无论是上面的高亮版本，还是暗色调版本，无论是png格式，还是jpg,bmp格式,无论多少大小，这些图片最终得到的指纹都是：416162545cd5f4，即可判别为相同的图片。</p>
<p>这里有两个zip格式的压缩文件<a href="http://www.qlcoder.com/download/image1.zip">image1.zip</a>和<a href="http://www.qlcoder.com/download/image2.zip">image2.zip</a>，第2个压缩文件里含有30张图片，编号为1-30。 第1个压缩文件中含有5000张图片，编号为1-5000 。  image2.zip中的30张图片均有1张相似图藏在image1.zip中…请将这30张相似图找出来,本题答案为这30张相似图的编号的总和。</p>
<p>为了便于大家理解,请对应查看 两个压缩文件的第一张图1.jpg...</p>',
                    'answer' => '69881',
                    'material' => 'lenna是花花公子第一刊的封面女郎,这个只是半身照，全身照实在是...太性感了',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-09-30 21:24:33',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 700,
                    'y' => 360,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 1449,
                ),
            32 =>
                array (
                    'id' => 33,
                    'title' => '爬虫-5',
                    'content' => '<blockquote>
<p>Boss："小吴啊，帮我爬下新浪，搜狐等门户网站的首页，我想知道他们在主推什么热点消息……"
小吴piapiapia很快的写好了爬虫，对他来说简直轻而易举易如反掌……</p>
<p>Boss："小吴啊，这些网站一年前的首页在主推什么热点消息啊？能不能爬个近5年的给我看看…"
小吴…</p>
</blockquote>
<p>很多时候，我们不止需要知道一个网站现在的内容，可能还想知道它的整个发展演化过程中的历史内容。</p>
<p>新浪经过了10多年的发展，我想知道2004年07月15号的新浪网主页（<a target="_blank" href="http://www.sina.com">www.sina.com</a>）的<a target="_blank"  href="http://zhidao.baidu.com/link?url=C5Y-VzTNB-cI4DdyKgveEMSrVgClcB1uy6XcyQU7Ulr7k2lyJeiJ833y6CTzAvoXl2AGHuj4LP9ih-vMhLDgk_">首焦</a>的中文广告语。</p>',
                    'answer' => '新浪一切由你开始',
                    'material' => '夫以铜为镜，可以正衣冠；以古为镜，可以知兴替。互联网的发展史是一面非常有思考价值的镜子呢！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-02 18:30:13',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => '82638883@163.com',
                    'x' => 625,
                    'y' => 480,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 826,
                ),
            33 =>
                array (
                    'id' => 34,
                    'title' => '喜刷刷',
                    'content' => '<p>现在的互联网上充斥着非常大量的虚假信息，比如——</p>
<ul>
<li><a target="_blank" href="http://baike.baidu.com/link?url=SVhl6MxMWFKDdHVvCvf_kTwwBJadf8UztDeMBmwSUiIQ4RRrT-zSpQYVeW2ETqgBBmzUDtaXnKpya2Dfc73pWIV4OEBveDJj1wzb7Kotgei">微博僵尸粉</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=pys1hFcdlv-J05FAp_wI1GEToQv68FCVsgsFcb6Gw_uQDelK4_K6yWJtS1uEOI8bBiTGkVYyeumfttpqD7Wwxq">淘宝刷单</a></li>
<li><a target="_blank"  href="http://www.zhihu.com/question/26802350">知乎刷赞</a></li>
<li><a target="_blank" href="http://baike.baidu.com/view/1522.htm">垃圾邮件</a></li>
</ul>
<p>任何一个ugc性质的网站都需要做好一个基本功：识别哪些是真实用户沉淀的内容，哪些是程序模拟真实用户产生的恶意行为。 一般各个公司都会有一个专门的小分队：anti-spam team。 @若远同学就是专业防刷30年…</p>
<p>这里有一个<a target="_blank" href="http://www.qlcoder.com/train/handsomerank">最帅coder评选排行榜</a>…</p>
<p>用户可以上传他认为最帅的coder的<strong>名字</strong>及其<strong>头像</strong>，并为他点赞…</p>
<p>被点赞数超过1000的coder，通过此题…</p>
<hr>
<p>一般点赞这种行为会设计一个验证码…来区别您是普通人还是机器…</p>
<p>我们网站是coder专享的…验证码当然会难一点啦~
这里的验证码是一个自然数x…他能使 md5(当天日期+你的用户名+当前的票数+x)的前6位都是0…</p>
<p>举例: 假如2015年12月4号食年已经拿到了1014票,当你想投第1015票的时候,你的验证码可以是12011618,因为
"20151204shinian101412011618"的md5值是"0000003A19CF73CF3E9799219A9FFF4F",这个md5前6位都是0…</p>
<pre><code><?php
$date="20151204";//日期
$name="shinian";//你支持的帅coder的用户名(大多数情况就是你自己)
$vote=1014;//当前的票数
$str=$date.$name.$vote;//php中的.代表字符串拼接
for($checkcode=0;;$checkcode++)
{

$ans=md5($str.$checkcode);
if(strpos($ans,"000000")===0)
{   
echo($checkcode."\\n");
break;
}   
}
?></code></pre>
<p>当你的票数超过1000，再次投票即可看见答案</p>',
                    'answer' => 'oreo is a option dog',
                    'material' => '虚假信息不仅占用了大量的服务器资源,还非常影响用户体验。
只有完全了解刷单公司是怎么操作的...才能彻底的防御住虚假信息的攻击...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-04 12:09:39',
                    'updated_at' => '2016-04-25 17:26:13',
                    'author' => 'vct_han@163.com',
                    'x' => 482,
                    'y' => 245,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 568,
                ),
            34 =>
                array (
                    'id' => 35,
                    'title' => 'markdown',
                    'content' => '<p>markdown现在已经是各大公司的标配了各位！！！</p>
<ul>
<li>写立项邮件</li>
<li>写周报</li>
<li>写设计文档</li>
<li>出数据报表</li>
<li>jobdescription</li>
</ul>
<p>它已经成为职业化素养的必要组成部分…</p>
<p><strong>Markdown</strong> 是一种轻量级标记语言，创始人为约翰·格鲁伯（John Gruber）。它允许人们“使用易读易写的纯文本格式编写文档，然后转换成有效的XHTML(或者HTML)文档”。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。
——维基百科</p>
<p><strong>优点</strong>：</p>
<ul>
<li>简单，容易上手</li>
<li>纯文本实现，程序员最爱，容易扩展，方便和其他工具联动</li>
<li>平台支持广：<strong>以Github为首的各种平台、各种博客都支持，基本上现在面向程序员的输入框都可以用Markdown来写了</strong></li>
<li>丰富的工具链
<ul>
<li>编辑器：各种支持所见即所得的编辑器</li>
<li>和各种其他格式互相转化的工具，PDF、Mobi、Epub、<strong>HTML</strong>等等，几乎你能想到的所有格式它都能转</li>
</ul></li>
</ul>
<p>这是用markdown撰写的<a target="_blank" href="http://121.201.63.168/uploads/144405210343108.html">一段内容</a>(乱码的同学请使用utf-8编码打开)，请使用千里码中的 markdown 编辑器，写一篇相同的内容（文字、图片、外链、格式均一致），并直接在答案框内提交 markdown代码 。</p>
<hr />
<p><strong>ps</strong>：简要介绍下千里码中 markdown 编辑器的使用方法，如图
<img src="http://121.201.63.168/uploads/144783577882185.png" alt=""  style="width:100%;"/></p>
<p>常用格式选项，指加粗，斜体，大号字体，加链接，加图片，无序列表，有序列表，code格式等。</p>
<p>选项说明，即说明该选项按钮的作用。</p>',
                    'answer' => 'oreo is a option dog',
                    'material' => '自从用了markdown...妈妈再也不用担心我去写word了',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-05 15:00:58',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'vct_han@163.com',
                    'x' => 595,
                    'y' => 156,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 323,
                ),
            35 =>
                array (
                    'id' => 36,
                    'title' => '大侠饶命',
                    'content' => '<ul>
<li>千里码，作为一个初创的程序员学习网站，在框架搭建或者编码的过程中，必然存在一些漏洞。</li>
<li>请直接利用漏洞攻破本网站的安全体系将此题设为通过.</li>
<li>跪求大哥别搞破坏…请将具体的漏洞细节提交至<strong>oreo@qlcoder.com</strong>,我们会第一时间联系你重谢…<strong>ikbc poker3</strong>双手奉上…</li>
</ul>
<p><img src="http://121.201.63.168/uploads/144419312073499.jpg" alt="我良辰必有重谢" /></p>',
                    'answer' => 'the answer is not here',
                    'material' => '此题认怂专用...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-06 22:30:49',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'vct_han@163.com',
                    'x' => 278,
                    'y' => 55,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 0,
                ),
            36 =>
                array (
                    'id' => 37,
                    'title' => '访客统计2',
                    'content' => '<p>到这里，访客统计1大家都已经做出来了，大家设想一下，类似支付宝这样的公司，每天的uv可能上亿，访问日志的行数可能上10亿行！！！</p>
<p>ok，这里有个50亿行的日志文件，文件的每一行是一个整数（这个整数是一个用户的userId），代表该userId的用户访问了1次网站…
那么问题来了，访问网站次数最多的用户是哪一个？本题答案就是该用户的userId。</p>
<p>一个50亿行的日志文件，上传到本网站上让大家下载，对此，shinian是拒绝的…</p>
<p>但是，万能的<strong>@玉龙</strong>提供了一个<strong>日志文件的生成器</strong>。<strong>@玉龙</strong>提供的两段生成日志的代码，分别是<a href="http://www.qlcoder.com/uploads/144423128246709.java">java语言描述</a>和<a href="http://www.qlcoder.com/uploads/144423117543815.cpp">c语言描述</a>。（这两段代码输出一致,只是为了方便各位同学,由于该题非常需要执行效率,抱歉没有提供高级语言的版本）</p>
<ul>
<li>PS: 如果你找到了多个userId并列第一,填写任意一个都可通过此题。</li>
</ul>',
                    'answer' => 'oreo is a option dog',
                    'material' => '之所以是50亿,一是因为这个数据符合我国的人口预算..二是正好超过了很多机器的内存大小...让问题变得更棘手了',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-07 23:17:47',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 374,
                    'y' => 350,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 1562,
                ),
            37 =>
                array (
                    'id' => 38,
                    'title' => 'java反编译',
                    'content' => '<p><strong><em> 如果你还没有接触 java，可以暂时把这个task先放一放</em></strong></p>
<p>在工作中，我们往往会用到java。java是目前拥有最多的第三方库的语言，java也是开源社区氛围最浓厚的语言。
apache基金会下的<a target="_blank"  href="http://lucene.apache.org/">lucene</a>、<a target="_blank"  href="http://lucene.apache.org/solr/">solr</a>、<a target="_blank"  href="http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html">hadoop</a>、<a target="_blank"  href="http://spark.apache.org/">spark</a>等等明星产品均有java编写。</p>
<p>在我的工作中，经常会用到第三方的java库来快速满足业务开发的需要,由于并不是每个jar包都会提供相应的源码让我更好的学习，往往会用到一些反编译工具。比较有名的java反编译工具比如<a target="_blank"  href="http://jd.benow.ca/">jd-gui</a>已经可以满足我大部分java方面反编译的诉求了。</p>
<p>这里有一个编译后的<a  href="http://121.201.63.168/download/Branches.class">java的class文件</a>，你也可以直接运行这个class类，本题的答案就是该文件运行的结果。
这段代码跑得实在太慢了，我真的没有耐心等到它跑完呢！！！</p>',
                    'answer' => '424293775424',
                    'material' => '反编译出来的类，往往会比较凌乱，整理代码什么的是必须的！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-09 19:02:04',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 910,
                    'y' => 190,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 1250,
                ),
            38 =>
                array (
                    'id' => 39,
                    'title' => 'vim',
                    'content' => '<p><a target="_blank" href="http://www.vim.org/">vim</a> 和 <a   target="_blank" href="https://www.gnu.org/software/emacs/">emacs</a> 被成为程序员的两大神器。
世界上只有三种编辑器，emacs、vim和其它。</p>
<p>目前 linux系统天然支持vim，vim已经成为了众多程序员的不二选择。
然而vim那陡峭的学习曲线却让许多coder望而生畏了。</p>
<p>在这里，我希望大家去了解&尝试使用vim，虽然你可能最终不能接受它。</p>
<p>try and fails，not fail to try！</p>
<p>请打开vim编辑器,依次输入</p>

<code>it&lt;Esc&gt;$ae&lt;Esc&gt;ih&lt;Esc&gt;ea s&lt;Esc&gt;ii&lt;Esc&gt;bea na&lt;Esc&gt;hxpasr&lt;Esc&gt;iwe&lt;Esc&gt;A b&lt;Esc&gt;3aan&lt;Esc&gt;x</code>
<p>在获得答案的同时感受vim带来的美（gui）妙（chu）= =！</p>',
                    'answer' => 'banana',
                    'material' => 'VIM is the God of editors, EMACS is God’s editor',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-11 17:33:10',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 580,
                    'y' => 250,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 155,
                ),
            39 =>
                array (
                    'id' => 40,
                    'title' => '缺失的后缀',
                    'content' => '<p>在windows系统中，我们往往用文件扩展名来代表文件的类型。
比如.avi后缀的代表视频文件,.rar后缀的代表压缩文件，windows系统根据文件的扩展名来区分不同的文件类型并选择合适的应用程序打开。</p>
<p>用户的<a target="_blank" href="http://yun.baidu.com/">百度网盘</a>中，往往存放着各式各样的类型的文件，由于用户上传不规范等各种原因很多文件的后缀已经缺失了。网盘的很多比如视频的播放功能，文档的预览功能都需要文件后缀的支持。</p>
<p>这里有一个<a href="http://www.qlcoder.com/download/noname">放着本题答案的文件</a>，希望你可以找到正确的打开方式。</p>',
                    'answer' => 'metadata',
                    'material' => '百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。欢迎各位使用百度网盘！！！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-12 17:18:50',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 700,
                    'y' => 305,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 309,
                ),
            40 =>
                array (
                    'id' => 41,
                    'title' => '打车匹配',
                    'content' => '<p><img src="http://121.201.63.168/uploads/144480005188365.jpg" alt="" style="width:100%" /></p>
<p><a target="_blank"  href="https://get.uber.com.cn/drive/"><strong>Uber</strong></a>(优步)-全球即时用车软件，现已覆盖全球55个国家，300多个城市。Uber旨在为大家带来更安全舒适的出行方式，让城市变得更方便快捷。加入“人民优步”，通过为社区中的乘客提供出行乘车服务，每周赚取收入。公益拼车，丰厚收入，自由工作时间，解决城市交通拥堵！</p>
<p><strong>Uber</strong>拥有一个庞大的数据库，包含了所有它覆盖的城市的司机信息，所以当有乘客需要接送的时候，Uber可以立刻将乘客和最合适的司机匹配起来。</p>
<p>某日下午2:30 p.m，某城市有50名乘客(<em>编号分别为P1-P50</em>)向uber发送50个打车请求，与此同时，有100辆空闲uber车辆(<em>编号分别为U1-U100</em>)在这50名用户附近，请提供一个你认为最优的匹配方案，将50名乘客和车辆进行匹配,使其中50辆空闲uber车辆与50名乘客的总直线距离最短（不考虑拼车）。</p>
<p>请在答案框内直接输入匹配方案（共50行，每行代表一个乘客和1辆uber car匹配）。如 </p>
<p>P1-U4
<br>
P2-U3<br>...<br>P50-U88</p>
<p>（其中 P1-U4，P2-U3 分别代表编号为 <strong>P1</strong> 的乘客与编号为 <strong>U4</strong> 的uber空闲车辆进行匹配，编号为 <strong>P2</strong> 的乘客与编号为 <strong>U3</strong> 的uber空闲车辆进行匹配）</p>
<p><strong>PS:</strong>由于考虑到城市真实情况比较复杂（如红绿灯，交通堵塞，高架，海拔，河流，山丘等），所以<strong>题中uber车辆与乘客的距离，仅考虑直线距离，并且，乘客和uber车辆坐标以二维坐标表示，精确到小数点后一位，单位：百米。</strong></p>
<p>（点击查看 <a target="_blank"    href="http://www.qlcoder.com/uploads/passenger.txt">50名乘客的二维位置坐标</a> 和 <a target="_blank"    href="http://www.qlcoder.com/uploads/ubercar.txt">100辆空闲uber车辆的二维位置坐标</a>）</p>
<pre><code>举例：有P1、P2两名用户同时打车，附近有U1、U2、U3三辆uber空闲车辆

P1、P2的坐标分别为 （14.0，90.0）；（50.0，100.0）

U1、U2、U3的坐标分别为 （30.0，54.0）；（70.0，35.0）；（95.0，90.0）

此时，
P1与U1的直线距离为sqrt[(14.0-30.0)²+(90.0-54.0)²]≈39.4
P1与U2的直线距离为sqrt[(14.0-70.0)²+(90.0-35.0)²]≈78.5
P1与U3的直线距离为sqrt[(14.0-95.0)²+(90.0-90.0)²]≈81.0
P2与U1的直线距离为sqrt[(50.0-30.0)²+(100.0-54.0)²]≈50.2
P2与U2的直线距离为sqrt[(50.0-70.0)²+(100.0-35.0)²]≈68.0
P2与U3的直线距离为sqrt[(50.0-95.0)²+(100.0-90.0)²]≈46.1

由于本题仅考虑总直线距离最短，则最优匹配方案为P1-U1，P2-U3，最短总直线距离约为85.5，直接在答案框内输入：

P1-U1
P2-U3

即可。</code></pre>',
                    'answer' => 'oreo is a option dog',
                    'material' => '打开优步 遇见更有趣的世界！ 找工作，上优步！找妹子，上优步！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-14 23:38:56',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'vct_han@163.com',
                    'x' => 660,
                    'y' => 60,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 100,
                ),
            41 =>
                array (
                    'id' => 42,
                    'title' => '新词发现',
                    'content' => '<p>随着社会的发展，词汇也在不断的增加。用户搜索的句子中不断的出现新的词汇，而这些词汇往往代表着潮流和趋势。如何发现新的词汇，抓住潮流，满足用户的搜索诉求，成为搜索&推荐的基本技能点。</p>
<p>以一淘举例:</p>
<p>去年突然被热搜的: 恶犬狗头包（一种包包）... 如果不借助新词发现，运营mm们是很难在第一时间洞悉到这个词汇被慢慢的成为潮流趋势的。</p>
<p>运营可以利用新词发现组件把握最近的潮流趋势，第一时间洞悉用户的诉求，对提高转化率等等关键kpi指标都是起到很大作用的。</p>
<p>下面我们来介绍下中文的新词发现的基本逻辑:</p>
<p>考虑两个字："信" "息"。</p>
<p>在长篇小说 三体1-地球往事（共194285字）中，"信"共出现303次，出现的概率为『0.156%』，"息"共出现了218次，出现的概率为『0.112%』。 如果"信"和"息"这两个字没有任何关联，他们一起出现的概率为『0.156%*0.112%=0.017‱』（万分之0.017）。 而事实上，"信息"共出现了174次，出现的概率为『0.089%』,这个数字是『0.017‱』的500多倍…那么说明："信"和"息"这两个字是有千丝万缕的关系的，很有可能是一个词！ 这个500多倍就称之为"信息"这个词的内部凝固程度。</p>
<p>这里是长篇小说<a href="http://www.qlcoder.com/download/santi.txt">三体1-地球往事</a>的下载链接，我想知道在这个小说中，内部凝聚程度最高的词是哪个？</p>
<p>PS: 由于中文的博大精深，为了简化问题，这里只考虑由两个字组成的词。并且为了避免生僻词的干扰，只考虑在三体中出现次数大于100次的词。</p>',
                    'answer' => '研究',
                    'material' => '消灭人类暴政！世界属于三体！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-21 14:14:05',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 265,
                    'y' => 330,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 1315,
                ),
            42 =>
                array (
                    'id' => 43,
                    'title' => '拼图',
                    'content' => '<p>拼图游戏是广受欢迎的一种智力游戏，它的变化多端，难度不一，让人百玩不厌。</p>
<p>个性化的拼图，拼凑的不仅仅是一张照片，而是一个故事，一段回忆，一缕温情。每一片的单片都有它自己的位置，就像每段回忆都有它的故事，你要将它放在专属的地方，放对了就慢慢丰富起来，放错了就无法完整。</p>
<p>你可以把你记忆中最深的片段，可以是你挚爱的照片，可以是你最难忘的一瞬留念，做成拼图，在思念的季节里一一拼起，把片片散落的记忆重新组合，用指尖温习甜蜜，把心湖里最美丽的涟漪荡漾开来。如下图：</p>
<p><img src="http://121.201.63.168/uploads/144566441752215.png" alt="" style="width:100%" /></p>
<hr />
<p>在图像图形领域，<strong>图像相似度检测</strong>是一个比较难的技能点。
其中的应用领域有:</p>
<ul>
<li>两个人相貌的相似度比较。夫妻相比较，现在相亲节目非常流行。</li>
<li>同款以及相似款商品的搜索。（喜欢黑白格子衣服的mm可以搜到类似的黑白格子的其他款式的衣服）。</li>
</ul>
<p><br></p>
<p>下面是一个非常碎片化的<a href="http://121.201.63.168/download/pieces.zip">拼图文件</a>，共4800片。请利用图形图像相关知识把他复原。</p>
<p>本题答案，将在拼图正确拼装后，显示在拼图上。</p>',
                    'answer' => 'none',
                    'material' => 'you shall not pass !!!

PS: bsguedes说他不需要键盘，这个出题送的键盘就给第一个做出的coder啦。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-24 12:59:51',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 700,
                    'y' => 440,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 8333,
                ),
            43 =>
                array (
                    'id' => 44,
                    'title' => '扫地机器人',
                    'content' => '<hr />
<p>手机党慎入,图片+广告开始！！！！！！！！！</p>
<hr />
<p>扫地机器人，又称自动打扫机、智能吸尘、机器人吸尘器等，是智能家用电器的一种，能凭借一定的人工智能，自动在房间内完成地板清理工作。一般采用刷扫和真空方式，将地面杂物先吸纳进入自身的垃圾收纳盒，从而完成地面清理的功能。扫地机器人最早在欧美市场进行销售，随着国内生活水平的提高，逐步进入中国。</p>
<p>那么问题来了——</p>
<p>--扫地机器人哪家强？</p>
<p>--天猫商城找<a target="_blank"  href="https://ecovacssz.tmall.com/search.htm">科沃斯</a>！</p>
<p><img src="http://121.201.63.168/uploads/144610432115588.png" alt="" style="width:100%" /></p>
<p><a target="_blank"  href="http://www.ecovacs.cn/dibao-list.html">科沃斯地宝</a>（Ecovacs Deebot），是科沃斯集团研制的一款机器人吸尘器，它集拖扫吸于一体，不用人工和水就能将地面打扫干净，且能设定时间预约打扫，自行充电。前方有设置感应器，可侦测障碍物，如碰到墙壁或其他障碍物，会自行转弯，并依据初始设定，走不同的路线，有规划清扫地面。</p>
<p>补个正脸特写</p>
<p><img src="http://121.201.63.168/uploads/144611916768698.jpg" alt="" /></p>
<hr />
<p>我是分割线，代表广告结束</p>
<hr />
<p>对于一个优秀扫地机器人来说，可以在复杂的生活场景中（包括厨房，客厅，餐厅，卧室）规避障碍物，并且利用出色的寻路算法最快速的遍历清扫整个室内的每一个小角落！并且不会在某些区域重复打扫，也不会出现某些区域没有扫到。</p>
<p>在这里，我们会给你一个生活的场景，包括地面和障碍物，你需要给扫地机器人选点一个起始点，以及规划后续的打扫路径，使扫地机器人能一次性扫完整个房间。</p>
<p>由于涉及到加速度以及电池续航能力的考虑，一旦扫地机器人选择了一个方向开始运动，除非碰到了障碍物或者明确已经扫过的地面才会选择换方向。否则前方是没扫过的脏的地面就一直向前扫。（考虑到切换方向需要电池成本）</p>
<p>为了方便大家理解，这里有个<a target="_blank" href="http://www.qlcoder.com/train/cr">小游戏</a>，其中箱子代表可能出现的障碍物（比如桌子，椅子，床），剩下的就是需要扫的地面啦！你可以点击任意1个地面开始放置扫地机器人，然后按上下左右键控制扫地机器人的方向。</p>
<ul>
<li>本题共1000关,每个会布置一个室内场景，以01的二维矩阵给出，0代表空地，1代表障碍物。</li>
<li>为了便于大家理解，前50关有一个<a href="http://www.qlcoder.com/train/cr" target="_blank" >游戏demo</a>。</li>
<li>本题每关1分，共1000分，希望大家通过程序自动化读取地图，以类似<a href="http://www.qlcoder.com/task/7581" target="_blank" >洗刷刷</a>的方式自动化提交。
</li>
<li>
本题完整版（共1000关）已如期上线，点击查看<a href="http://www.qlcoder.com/train/autocr" target="_blank" >程序自动提交页面</a>。
</li>
</ul>',
                    'answer' => 'oreo is a option dog',
                    'material' => '自从买了扫地机器人。shinian再也没让我扫过地了。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-10-29 15:31:37',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'vct_han@163.com',
                    'x' => 560,
                    'y' => 80,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 209,
                ),
            44 =>
                array (
                    'id' => 45,
                    'title' => 'html5',
                    'content' => '<p><a target="_blank" href="http://baike.baidu.com/view/951383.htm">HTML5</a> 将成为 HTML、XHTML 以及 HTML DOM 的新标准。
HTML 的上一个版本诞生于 1999 年。自从那以后，Web 世界已经经历了巨变。
HTML5 仍处于完善之中。然而，大部分现代浏览器已经具备了某些 HTML5 支持。</p>
<p>HTML5 中的一些有趣的新特性：</p>
<ul>
<li>用于绘画的 canvas 元素</li>
<li>用于媒介回放的 video 和 audio 元素</li>
<li>对本地离线存储的更好的支持</li>
<li>新的特殊内容元素，比如 article、footer、header、nav、section</li>
<li>新的表单控件，比如 calendar、date、time、email、url、search</li>
</ul>
<p>微信团队在很很很早期就对html5做了特别多的支持。</p>
<p>如果你对html5非常有兴趣了解的话，可以自行查阅google&baidu。</p>
<p>在这里我想重点介绍一个html5的新特性，localstorage。</p>
<p>非常推荐<a  target="_blank"  href="http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html">这篇文章</a>，里面有很详细的讲解。</p>
<p>ok，接下来进入正题，在这里我们悄悄得在你的localstorage里面放了5段html片段。</p>
<p>分别是LocalFile0，LocalFile1，LocalFile2，LocalFile3，LocalFile4 ，请将他们按照该顺序合并成一个html文件，打开浏览就能看到答案了。</p>',
                    'answer' => 'the answer is not here',
                    'material' => '勇于探索新知识，适合的就是最好的',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-11-10 22:45:59',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 320,
                    'y' => 145,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 251,
                ),
            45 =>
                array (
                    'id' => 46,
                    'title' => '代理IP',
                    'content' => '<p>在工作中很多时候我们会需要用到代理ip……</p>
<ol>
<li>突破自身IP访问限制，访问国外站点，教育网、过去的169网等。</li>
<li>网络用户可以通过代理访问国外网站。</li>
<li>访问一些单位或团体内部资源，如某大学FTP（前提是该代理地址在该资源 的允许访问范围之内），使用教育网内地址段免费代理服务器，就可以用于对教育网开放的各类FTP下载上传，以及各类资料查询共享等服务。</li>
<li>突破中国电信的IP封锁：中国电信用户有很多网站是被限制访问的，这种限制是人为的，不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试。</li>
<li>提高访问速度：通常代理服务器都设置一个较大的硬盘缓冲区，当有外界的信息通过时，同时也将其保存到缓冲区中，当其他用户再访问相同的信息时， 则直接由缓冲区中取出信息，传给用户，以提高访问速度。</li>
<li>隐藏真实IP：上网者也可以通过这种方法隐藏自己的IP，免受攻击。</li>
<li>爬竞争对手数据等无节操的爬虫。</li>
<li>马甲&水军……</li>
</ol>
<p>等等…</p>
<p>这里有一个只能访问千里码的代理IP：121.201.63.168，端口：8080</p>
<p>请使用<strong>该代理IP</strong>访问<a target="_blank"  href="http://www.qlcoder.com/train/proxy">指定网页</a>，即可获取本题答案。</p>',
                    'answer' => 'the answer is not here',
                    'material' => '很多时候爬虫都是需要配合代理ip的哦，否则妥妥的被封。。。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-11-18 20:03:17',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'han.ze@qq.com',
                    'x' => 520,
                    'y' => 440,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 212,
                ),
            46 =>
                array (
                    'id' => 47,
                    'title' => '访客统计3',
                    'content' => '<p>很多时候对于规模巨大的数据统计需求,是允许存在一些误差的。（参考国家统计局）
如果想100%没有误差，需要非常非常大的成本。</p>
<p>举个很浅显易懂的例子:</p>
<p>如何计算1个池塘里有多少鱼?</p>
<ul>
<li>
<p>没有误差的办法就是每条都捞上来统计…但没有太多实际价值和可行性。</p>
</li>
<li>实际比较实用的方案: 先从池塘里捞出100条鱼，都做上记号，投放一段时间，等这些鱼在池塘里游匀之后，再打捞。如果捞出了100条鱼，做上了记号的有2条，说明有记号的鱼占池塘中总鱼数的百分比为2%，由此计算出池塘中鱼的总数目大约为5000条。</li>
</ul>
<p>每天有数亿人上百度，淘宝，对于有多少访问这个问题，想精确到个位数需要耗费非常大的代价（计算时间，集群资源，比较普遍的做法就是把上百亿行日志文件拉出来，做个map-reduce）。
因此更多场景下我们可以用更小的计算资源(你的个人电脑)得到一个大家都满意的，误差比较小的结果（精确到99.99%）。</p>
<p>接下来有1个500亿行的文件，文件的生成方式类似访客统计2..同样提供<a href="http://121.201.63.168/uploads/144793281092879.java">java语言描述</a>和<a href="http://121.201.63.168/uploads/144793321489801.cpp">c语言描述</a>。</p>
<p>文件的每一行是一个整数（这个整数是一个用户的userId），代表该userId的用户访问了1次网站…
我想知道今天大约有多少人上了这个网站，精确到99.99%。</p>
<p>你提交的数字和最正确的答案的误差在0.01%即可接受。</p>',
                    'answer' => 'oreo is a option dog',
                    'material' => '大数据时代的到来，使得统计学也渐渐成为IT界一个比较重要的技术分支。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-11-19 19:44:12',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 440,
                    'y' => 280,
                    'contributor' => 8,
                    'study' => '',
                    'score' => 2439,
                ),
            47 =>
                array (
                    'id' => 48,
                    'title' => 'openssl',
                    'content' => '<p>ssl&openssl</p>
<p>如果大家现在再访问 <a target="_blank" href="https://www.taobao.com">淘宝</a>,细心的朋友会发现，整个淘宝网已经从  <a target="_blank" href="http://baike.baidu.com/link?url=0H996TYCMSiAyrm9J1y32pZuS3lhcCr8DOdOBaLZcdPWXUdJkooncwe42oC7A2StSyIW4oqZ2H_UqOnddzTqd_">http协议</a>转变成了<a target="_blank" href="http://baike.baidu.com/link?url=SkcWnQ6raOPlZX0BMVQgpHvIAbq6YxpsgX0KAEGxKUyRIVgr9tRxRdrJSVkrzT2OJxp-iKI1jDC62pXQ5LJIMa">https协议</a>。（<strong>https</strong>://www.taobao.com）</p>
<p>http一直是明文传输了，对于淘宝这样体量的网站，会遇到哪些问题呢？
为什么淘宝需要从http协议更改成https呢？</p>
<p>举一个例子：</p>
<h5>运营商劫持</h5>
<p>用户在淘宝网搜索羽绒服，向淘宝网发起请求之后，淘宝网根据内部核心的算法和数据推算，向用户返回返回淘宝网认为现在最好的top40个羽绒服的时候，一些地方的运营商，可以截获淘宝的http包，然后篡改其内容。比如：插入4件质量低下的羽绒服置顶。
这是一个很恐怖的事情，相当于直接改变了淘宝的排序规则，很多不法商家在退货率极高，次品率极高的情况下，能直接联系运营商，强行展示在用户面前。这不仅伤害了阿里巴巴，也直接伤害了用户的购买体验。</p>
<p>如果切换成https协议，那么这类事件将不会发生。</p>
<p><a target="_blank" href="http://baike.baidu.com/link?url=SkcWnQ6raOPlZX0BMVQgpHvIAbq6YxpsgX0KAEGxKUyRIVgr9tRxRdrJSVkrzT2OJxp-iKI1jDC62pXQ5LJIMa">https协议</a>是在<a target="_blank" href="http://baike.baidu.com/link?url=0H996TYCMSiAyrm9J1y32pZuS3lhcCr8DOdOBaLZcdPWXUdJkooncwe42oC7A2StSyIW4oqZ2H_UqOnddzTqd_">http协议</a>的基础上增加了<a target="_blank" href="http://baike.baidu.com/view/16147.htm">ssl</a>层。</p>
<p>而openssl，是目前被广泛应用的ssl的一个开源实现。
apache基金会的很多开源项目也都直接间接的引用openssl的实现。</p>
<p>在整个互联网发展史上，密码学一直起到至关重要的作用。</p>
<ul>
<li><a target="_blank" href="http://baike.baidu.com/link?url=Wz7t85nWXsV8_xUjs_fR0YlS-KW-AMoGqdJIQ7fAM5D7k3p0FIvLXemC1qa6nI8KRtl3bAbhW8EEkT6uQjS_Ca">md5</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=exTlvHyIZ93t6REA0V6joi-6ZlWc3m_NTGIygWHUmjqHfsWF5zwx0uPGmuHb-UhbPuOnNoU_RDI9DvW7o0wUP_rbC1WgSmNt7mBDK2jqCh444E_Unp22R4pEF3sLpMEV">rsa</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=D7VpiESIIIQeYzu4262Uba4JX-7P7rb2YsrbBZxgic6urEBHGGGAODftzt1QVT0nZ2cMoR7zOM9BoVfRqWNhP_">sha系列</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=3sktEy4Jy5hGcamIdytn2LRpcdoAGj9xeICRaX8sYLScr5LeA_jLRrHpsvSxSdguvA5z_vmjXhqite7J-40_QEP8rcwDjwzZc-gTb9ULg9C">aes</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=NaQqlyC6HvMVWQ163_jPjYntnQhXVrdAOmp-iGWvBmhRO8t7iPwc2En2cfoqAiABNV0_b7Ir9WBwidwFMWZki_">blowfish系列</a></li>
<li><a target="_blank" href="http://baike.baidu.com/link?url=Dgg2nJOFJCP5wvwE9uvx7-gl27w9OulbTjfUP9y-h2oymUuH6kC4bOrJ-ZSUDpG2Fd4a1VLJMMD6ybgReDDioa">des系列</a></li>
</ul>
<p>以上加密算法被广泛运用于各大领域。广泛到完全不需要我来枚举。
openssl对以上算法都有实现。</p>
<p>为了使大家对openssl能有一个更加深入的了解，
下面有一个<a target="_blank" href="/download/blowfish.data">使用openssl blowfish加密方式加密的文件</a>，
使用openssl解密之后就能看到答案了哦。
blowfish的解密密码是[qlcoder]。</p>',
                    'answer' => 'noanswer',
                    'material' => '虽然openssl频繁爆出漏洞，代码实现很糟糕，甚至OpenBSD发起一个清理OpenSSL代码的项目。。。但是世界还是离不开它！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-11-25 21:57:42',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 260,
                    'y' => 200,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 609,
                ),
            48 =>
                array (
                    'id' => 49,
                    'title' => '同图搜索-2',
                    'content' => '<p><a target="_blank"  href="http://www.taotaosou.com/">淘淘搜</a> 是国内最大的图片购物搜索，已获得全球最大的电子商务集团阿里巴巴，和国内著名投资机构鼎晖投资、德同资本的投资。现已收录超过4亿商品数，超过10亿张商品图片。</p>
<p>淘淘搜，只需一张商品图片就能快速找到同款、相似款，进行商品比价。比如：逛街时看到一款喜欢的连衣裙，无法用文字描述，就可以把这张图片上传到淘淘搜进行搜索，能很快找到这款连衣裙，并且有全网同款比价。</p>
<p>如图，找到某款连衣裙之后，不仅显示该连衣裙的主图，且在下方会显示该连衣裙价格不一的同款。这些同款图片虽与主图相似，但还是有些不一样的地方，比如多一个logo，只有部分截图，模特pose不一样等等。</p>
<p><img src="http://121.201.63.168/uploads/144854094073367.png" alt="" style="width:100%"/></p>
<p>之前的同图搜索-1，我们已经介绍如何把一张图片转换成图片的指纹。
但是在实际的环境中，很多本质上相同的图片，会有细微的差距，举个例子，
角落上被打了logo，或者图片带有水印。因为，在真实的场景下进行相似图片的查找，不仅仅是找指纹相同的图片，也要找 指纹很相似的图片。</p>
<p>举个例子，假设图片的指纹是16位的二进制。</p>
<p>图片A: 101011<font color="red">1</font>01010111<font color="red">0</font></p>
<p>图片B: 101011<font color="red">0</font>01010111<font color="red">1</font></p>
<p>这两张图片的指纹，只有2位不一致（第7位和第16位），很有可能是相似的图片。
我们可以粗略的判断这2张图片是近似的。</p>
<p>淘淘搜有近百亿张图片，当用户上传一张图片查询相似图片的时候，淘淘搜优先把指纹近似的图片找出来，然后用更为细致的算法进行比对。</p>
<p>下面有1个文件生成器，分别提供了<a href="http://121.201.63.168/download/144854971641892.java">java语言描述</a>和<a href="http://121.201.63.168/uploads/144855019285121.cpp">c++语言描述</a>，该文件有1000万行，每行代表1个图片生成的指纹。每个图片指纹是一个40位的二进制。</p>
<p>如果图片A和图片B的指纹，只有小于等于4位不同，我们可以认为图片B是图片A的相似图片候选集中的一个。</p>
<p>我想知道这1000万张图片中，哪张图片的候选集数量最大。
这题的答案是该图片的指纹。</p>',
                    'answer' => '1111011110001100011011110100100011011110',
                    'material' => '对于logo和图片牛皮癣等等杂质，这个方法是十分有效的，但是对于图片裁剪还有拍摄角度不同等问题，在同图搜索-3去解决吧！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-11-26 22:59:03',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'vct_han@163.com',
                    'x' => 780,
                    'y' => 400,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 5263,
                ),
            49 =>
                array (
                    'id' => 50,
                    'title' => '以图搜图-2',
                    'content' => '<p>
<img src="http://www.qlcoder.com/uploads/144898347791861.jpg" alt="" style="width:100%"/>
大家可以想一下，以上左右两张图片，描述的本质是同一个商品，但是用<a target="_blank" href="http://www.qlcoder.com/task/757b">同图搜索-1</a>的方法，是不会得到一个正确的结果的。因为两者的指纹会差得非常多。</p>
<p><a target="_blank" href="http://baike.baidu.com/view/8510039.htm">David Lowe</a>于1999年提出了<a target="_blank" href="http://baike.baidu.com/link?url=0CBJDLGfBEUOyJ9R-O8kXipTj5KWqCUlT2jBmJzwO63gp9NO-z6IRrWqwLh6XD9uosdov9Rkj4G5_d0-P6WF1_">sift</a>，在deep learning出现前，sift 是最最最为有效的相似图片识别的方案。自1999年开始的10年间，由sift演化出来各种近似sift的asift，surf等等算法，均在学术界和工业界得到非常广泛的运用。</p>
<p>sift和以图搜图1的方法的本质不同在于，sift采用的是局部特征点检测比对的方式。因此，只要两张图片有部分内容一致，就可以识别出来啦~</p>
<p>目前关于sift的学习资料和demo，包括开源的源码都有很多。
在这里，我推荐几个比较精华的..相信以各位的聪明才智，看完之后就能做出了。</p>
<ul>
<li><a target="_blank" href="http://demo.ipol.im/demo/my_affine_sift/">sift&asift演示demo,需翻墙</a></li>
<li><a target="_blank" href="http://blog.csdn.net/zddblog/article/details/7521424">sift原理&教学</a></li>
<li><a target="_blank" href="https://en.wikipedia.org/wiki/Scale-invariant_feature_transform">sift wiki</a></li>
<li><a target="_blank" href="http://docs.opencv.org/master/da/df5/tutorial_py_sift_intro.html">sift&opencv</a></li>
</ul>
<p>这里有两个zip格式的压缩文件<a target="_blank" href="http://www.qlcoder.com/download/sift1.zip">sift1.zip</a>和<a target="_blank" href="http://www.qlcoder.com/download/sift2.zip">sift2.zip</a>，第2个压缩文件里含有30张图片，编号为1-30。 第1个压缩文件中含有5000张图片，编号为1-5000 。 <a target="_blank" href="http://www.qlcoder.com/download/sift2.zip">sift2.zip</a>中的30张图片均有1张相似图藏在<a target="_blank" href="http://www.qlcoder.com/download/sift1.zip">sift1.zip</a>中…请将这30张相似图找出来,本题答案为这30张相似图的编号的总和。</p>
<p>为了便于大家理解,请对应查看 两个压缩文件的第一张图1.jpg...</p>',
                    'answer' => 'none',
                    'material' => '我国有无数篇博士论文『一种关于sift算法的在xxx领域的改进/优化』....这些论文的所有影响因子的总和无限趋近于0.',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-01 21:42:43',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => 'vct_han@163.com',
                    'x' => 780,
                    'y' => 440,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 5882,
                ),
            50 =>
                array (
                    'id' => 51,
                    'title' => 'smaller than smaller',
                    'content' => '<p>压缩算法在IT领域运用面非常之广。</p>
<ul>
<li>文件压缩（zip，rar，tar)</li>
<li>图片压缩（jpg，png）</li>
<li>音频（mp3）</li>
<li>动画的帧内压缩和帧间压缩</li>
</ul>
<p>最最最简单的字符串压缩方式就是<a target="_blank" href="http://www.cnblogs.com/xudong-bupt/p/3761417.html">游程编码</a></p>
<p>举例:   </p>
<ul>
<li>压缩前的字符串是: dfffffeeeeettttrrrrttttt  （长度:24）</li>
<li>压缩后是: d1f5e5t4r4t5   (长度:12)为了方便大家理解避免歧义,本题中如果连续出现30个a,会被压缩成9a9a9a3a</li>
</ul>
<p>将连续出现的字符统计出来表示成字符+数字的形式。</p>
<p>压缩了50%。</p>
<p>但是实际情况，往往有很多字符串，没有连续几个字符在一起的情况。比如banana。</p>
<ul>
<li>压缩前: bananabananabanana(长度:18)</li>
<li>压缩后: b1a1n1a1n1a1b1a1n1a1n1a1b1a1n1a1n1a1(长度:36)</li>
</ul>
<p>非常的sad..反而越压越长了…</p>
<p>肿么办,<a  target="_blank" href="https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform">Burrows–Wheeler transform</a>是一个优秀的重排序方案。<font color="red">请仔细看wiki中的例子以及"^|"的意义。</font></p>
<p>经过bwt之后</p>
<p>^bananabananabanana| 就变成了 |nnnnbbbnn^aaaaaaaaa
(其中^代表原字符串头，|代表原字符串尾)</p>
<p>|nnnnbbbnn^aaaaaaaaa 就可以按照游程编码压缩成为 |1n4b3n2^1a9（长度:12）</p>
<p>当然，我们也可以根据相应的|1n4b3n2^1a9 还原得到原来的字符串。</p>
<p>接下来有一段歌词，摘自<a  target="_blank" href="https://www.youtube.com/watch?v=sFukyIIM1XI">小黄人banana之歌</a>:BABABABANANABABABABABANANABABABABABANANABANANANAAHH</p>
<p>这题的答案是 这段歌词 bwt算法外加游程编码后的压缩结果。</p>',
                    'answer' => 'none',
                    'material' => 'babababa~~banana..洗脑循环100遍',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-05 23:47:46',
                    'updated_at' => '2016-04-25 17:26:14',
                    'author' => '82638883@163.com',
                    'x' => 800,
                    'y' => 310,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 740,
                ),
            51 =>
                array (
                    'id' => 52,
                    'title' => 'bgm',
                    'content' => '<p><img src="http://www.qlcoder.com/uploads/144948378922461.jpg" alt="" style="width:30%" /></p>
<p>优酷以 "快者为王"为产品理念，凭借"快速播放，快速发布，快速搜索"的产品特性，充分满足用户日益增长的互动需求及多元化视频体验，现已成为中国互联网领域最具影响力、最受用户喜爱的视频媒体之一。</p>
<p>优酷评论中最多最多的，就是 求背景音乐！！！
很多时候，在各种宣传片，小视频中经常听到自己喜欢的歌曲。但是呢，不知道这首歌叫什么…</p>
<p>这里有<a href="http://www.qlcoder.com/download/mix.mp3">一段mp3</a>，我想知道里面所有的歌曲名，作者以及专辑&发行年份。
这题的答案是这些歌曲所在的专辑的发行年份之和。
例:如果mp3只包含1990年发行的两首歌，那么答案就是3980。</p>',
                    'answer' => 'dangdangdang',
                    'material' => '这题的bgm听着好熟悉，就是想不起来出自哪里呢...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-07 18:09:11',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 627,
                    'y' => 188,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 3333,
                ),
            52 =>
                array (
                    'id' => 53,
                    'title' => 'bigger than bigger',
                    'content' => '<p>在<a target="_blank" href="http://www.qlcoder.com/task/75b4">smaller than smaller</a>里我们已经介绍了游程编码和<a target="_blank"  href="https://en.wikipedia.org/wiki/Burrows–Wheeler_transform">Burrows–Wheeler transform</a>转换。这里有<a target="_blank"  href="http://121.201.63.168/download/144957540328740.txt">一个文件</a>，该文件的文本内容摘自一本小说，文件经过 <a target="_blank"  href="https://en.wikipedia.org/wiki/Burrows–Wheeler_transform">Burrows–Wheeler transform</a>转换后进行了游程编码。整个编码方式和[smaller than smaller]类似。</p>
<p>这题的答案是该小说的作者名。</p>
<p>由于小说中可能出现数字，为了简化游程编码，文件中统计位的字符范围在[1-9],举例:</p>
<ul>
<li>"aaaaa"(连续5个a)会被游程编码为"a5"</li>
<li>"bbbbbbbbbbbb"(连续12个b)会被游程编码为"b9b3"</li>
<li>"1111111111111"(连续13个1)会被游程编码为"1914"</li>
</ul>
<p>因此整个文件的奇数位字符代表出现的具体字符，偶数位字符代表前面1个字符出现的次数。</p>',
                    'answer' => 'the',
                    'material' => 'wiki上的Burrows–Wheeler transform只是说明了原理，从原理到实战还是要经过很漫长的优化的哦...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-08 19:41:32',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 880,
                    'y' => 340,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 2564,
                ),
            53 =>
                array (
                    'id' => 54,
                    'title' => 'TOR',
                    'content' => '<p>网络隐私和网络安全会越来越重要。
从笔者自身角度出发:</p>
<ul>
<li>笔者不希望自己在网络上的行为被监视。
<ul>
<li>曾经由于工作原因，笔者所在team要做一个关于商品的需求分析，其中笔者负责爬取淘宝成人用品销量top的店铺和商品。因为爬取量不大，我就没有挂在服务器上，直接用自己的电脑跑了。结果，之后笔者访问各种网站，周围的广告不是充气娃娃就是震动棒= =！无意被同事和朋友看到，都要解释一番。『你不用解释了！』</li>
</ul></li>
<li>
笔者不希望被查水表&被人肉被网络暴力。
<ul>
<li>qlcoder目前rank top10的某个神犇因为被查水表…而…</li>
</ul>
</li>
<li>作为一个民主自由的国家，笔者有权保护的隐私。</li>
</ul>
<p>如何使自己的行为在网络上完全匿名化呢？
找代理ip是不够的。我们需要的是<a target="_blank"  href="https://www.torproject.org/index.html.en">TOR</a>！</p>
<p>TOR是一个完全匿名的网络。如果有兴趣的话可以查阅<a target="_blank"  href="https://www.torproject.org/about/overview.html.en">TOR官网</a>的介绍。</p>
<p>1995年， 美国海军研究实验室的科学家开始开发一种匿名技术， 可以避免人们的行迹在Internet上被追踪到。 他们把这个技术叫做“洋葱路由”。 “洋葱路由”利用P2P网络， 把网络流量随机的通过P2P的节点进行转发， 这样可以掩盖源地址与目标地址的路径， 使得在Internet上难以确定使用者的身份和地址。 这就好像你送一封匿名信， 不是自己送或者通过邮差送， 而是大街上随便找一个不认识的人让他帮你送。 这样收信方就很难往回找到你。</p>
<p>这里我简单的介绍下TOR是如何保护用户的隐私的。</p>
<p>支持TOR的用户会变成一个非常庞大的匿名集群，
当Alice想要和bob的服务器发生网络交互，TOR会随机的选择集群中的三个节点进行中间跳转。（如下图）</p>
<p><img src="http://121.201.63.168/uploads/144965441742982.png" alt="" /></p>
<p>当Alice想要和Jane交互时，TOR又会随机的选取3个节点进行中间跳转。</p>
<p><img src="http://121.201.63.168/uploads/144965453686475.png" alt="" /></p>
<p>同时，这些跳转（图片中的绿色连线）都是加密的，因此，整个访问链路是非常难以反向追溯的。</p>
<p>eff曾发<a  target="_blank"  href="https://www.eff.org/deeplinks/2014/06/why-you-should-use-tor">文章</a>呼吁每个人都应该使用TOR。这里，笔者推荐大家使用<a target="_blank" href="https://www.google.co.id/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwi43bz5wc7JAhUUkY4KHStmABAQFggaMAA&url=https%3A%2F%2Fwww.torproject.org%2Fprojects%2Ftorbrowser.html.en&usg=AFQjCNE2peoTRVhWzhSyDE84lPxexPimOg&bvm=bv.109332125,d.c2E">torBrowser</a>浏览器。</p>
<p><a  target="_blank"  href="http://torlinkbgs6aabns.onion/">TorLink</a>（只有Tor才能正常访问该链接）中罗列了很多常用的深网，
这题的答案是<a  target="_blank"  href="http://torlinkbgs6aabns.onion/">TorLink</a>中 Financial Services分类下的第一个网站的名字。</p>',
                    'answer' => 'the answer is not here',
                    'material' => '当然TOR也不是绝对安全的，切记不要干坏事哦，丝绸之路的老大正在蹲大牢呢。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-09 18:02:45',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 480,
                    'y' => 490,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 719,
                ),
            54 =>
                array (
                    'id' => 55,
                    'title' => 'QR Code',
                    'content' => '<p><a target="_blank" href="http://baike.baidu.com/link?url=dbbrAQMMcD78xmqWYW_M6ULMdB0Sy7riNoMY0aKw877PsX_GCbSZse667y_HSlLLc3uHf2cMqoIS5vsz9htx6q">QR Code</a>就是大家所熟悉的二维码，现在可以说在生活中随处可见了。
随着智能手机的普及，QR Code由于容错性好（不同角度拍摄识别度均很高），识别速度快等优点，被运用在各个生活场景中。
2010年铁道部也引进了QR Code.<br>
<img src="http://121.201.63.168/uploads/144974616615621.jpg" alt="" /></p>
<hr />
<p><img src="http://121.201.63.168/uploads/144974103290357.png" alt="" style="width:100%"/>
微信，是一个生活方式，是一款超过五亿人使用的手机应用。</p>
<p>自5.4版本开始，微信加入了识别图中二维码功能，即在好友聊天记录或者在微信朋友圈见到有“二维码”图片相关内容，用户都可以通过长按图片，然后就可以直接选择识别图中二维码了，如下图所示：</p>
<p><img src="http://121.201.63.168/uploads/144974197652912.png" alt="" /></p>
<p>很多不法份子将一些非法的钓鱼网站的url编入二维码中，误导很多微信用户点击打开，使一些用户遭受的损失。</p>
<p>因此微信的反作弊部门会在用户传图片的过程中自动的识别图片中的二维码，如果发现二维码中所含的信息涉及到非法的钓鱼网站，会立即屏蔽并对传播危险信息的用户做权限限制。</p>
<p>下图是一个比较大的QR Code的image，这题的答案就在里面^_^。</p>
<p><img src="http://121.201.63.168/uploads/144974949555397.png" alt="" /></p>',
                    'answer' => 'none',
                    'material' => '早期微信用户体验两大杀招: 扫一扫和摇一摇。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-10 19:19:39',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 667,
                    'y' => 225,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 375,
                ),
            55 =>
                array (
                    'id' => 56,
                    'title' => 'smallest',
                    'content' => '<p>上面一题只是一个bwt的教学题，这题是相对应的实战篇。</p>
<p>这里有一个文本文件:<a href="http://121.201.63.168/download/144982851178300.txt">战争与和平</a></p>
<p>这题的答案是这段文本经过bwt转换后的md5值。</p>
<p>如上题举例:</p>
<ul>
<li>原文 : ^bananabananabanana|</li>
<li>bwt转换后 : |nnnnbbbnn^aaaaaaaaa</li>
<li>md5之后 : bc900e3422bdab3deeb75838e5d09c03  (英文字符统一小写)</li>
</ul>',
                    'answer' => 'none',
                    'material' => '10年前照着wiki上的代码写了一段，跑到今天终于把『战争与和平』转换好了。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-11 18:14:01',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 880,
                    'y' => 280,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 2564,
                ),
            56 =>
                array (
                    'id' => 57,
                    'title' => '语音识别-2',
                    'content' => '<p>音频识别现在已经运用到各个领域。</p>
<p>ios系统的siri和google的同声翻译算是业界的翘楚。
目前google的实时语言翻译已经非常成熟了,附上<a target="_blank"  href="http://v.youku.com/v_show/id_XODcxODM3ODcy.html">视频地址</a>。
ios的siri卖肾即可体验。</p>
<p>bok说他看到了一张非常漂亮的图片，我问他图片里是什么内容，bok用vim编辑器以16进制打开了图片文件，然后开始一个byte一个byte的报给我...(这题的bgm就是bok碎碎念的声音！)。</p>
<p>这题的答案就在图片里。</p>',
                    'answer' => 'noneanswer',
                    'material' => '最新版的siri已经可以从用户说话的语气来感知用户的情绪，并作出适当的反馈。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-11 19:06:18',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 820,
                    'y' => 140,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 50000,
                ),
            57 =>
                array (
                    'id' => 58,
                    'title' => '抓包',
                    'content' => '<p>最近国民老公<a target="_blank" href="http://weibo.com/1826792401/D3bUt5eqa">王思聪的一条微博</a>把<a  target="_blank" href="http://www.qingting.fm/">蜻蜓fm</a>推上了风口浪尖。文章讲述国内某coder通过抓包工具发现蜻蜓fm的app在后台不断的向google ads发送http请求，继而反编译蜻蜓fm的app，发现了模拟用户打开app以及模拟用户点击广告的两个系统，代号普罗米修斯和宙斯。
想了解整个事件的可自行搜索。在这里着重介绍下整个事情的导火线工具:<a  target="_blank" href="http://baike.baidu.com/link?url=lPJcGId41zXhRmn8ZYTEqOaPas7U5j-R5Ka94QSmfnN9vaabOqu2D_vtv3VsuDiFoY_vVaet0p55r_c3vgrPo_">抓包工具</a>。</p>
<p>如果你是一名网络管理员，可能有过这样的经历：在某一天的早上你突然发现网络性能急剧下降，网络服务不能正常提供，服务器访问速度极慢甚至不能访问，网络交换机端口指示灯疯狂地闪烁、网络出口处的路由器已经处于满负荷的工作状态、路由器CPU已经到了百分之百的负荷……重启动后没有几分钟现象又重新出现了。
这是什么问题？设备坏了吗？不可能几台设备同时出问题。一定是有什么大流量的数据文件，耗尽了网络设备的资源，它们是什么？怎么看到它们？这时有经验的网管人员会想到用局域网抓包工具来分析一下。
你一定听说过红色代码、(尼姆达)Nimda、冲击波以及震荡波这些臭名昭著的网络杀手。就是它们制造了上述种种恶行。它们来势汹汹，阻塞网络、感染主机，让网络管理员苦不堪言。当网络病毒出现时，如何才能及时发现染毒主机？</p>
<p>这里有一个可执行的文件。分别提供3个平台的版本，由于发现windows兼容性的问题，windows版本之后给出。</p>
<ul>
<li><a  target="_blank" href="http://qlcoder.com/download/75c9linux.bin">linux bin</a></li>
<li><a  target="_blank" href="http://qlcoder.com/download/75c9mac.bin">mac bin</a></li>
<li><a  target="_blank" href="http://qlcoder.com/download/75c9win.exe">win.exe</a></li>
</ul>
<p>执行这个file，会向一个网站发一个http请求，你可以用抓包工具去查看网络数据。</p>
<p>推荐几个比较有名的抓包工具: <a  target="_blank" href="https://www.wireshark.org/">wireshark</a>以及 <a  target="_blank" href="http://baike.baidu.com/link?url=QgFHueaglZlQv1WwFMfmYQCO_OpZicz7qCiNiYY9-zZ2_s6iSaKg_1PvIVt2fGtUMvn3nrfYAPSdszytZy1Cka">tcpdump</a>。</p>
<p>这题的答案是该网站的host的域名。 格式:xxx.yyy.zzz。（举例: www.baidu.com）</p>',
                    'answer' => 'noanswer',
                    'material' => '第一次接触抓包还是15年前的黑基论坛呢',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-12 17:51:54',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 364,
                    'y' => 166,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 434,
                ),
            58 =>
                array (
                    'id' => 59,
                    'title' => '我要建站-3',
                    'content' => '<p>很多时候我们会需要持久化用户的数据,存储用户的数据有非常多的方式，比如文件系统，数据库（mysql等）,缓存（memcache，redis等）。</p>
<p>请提供一个url（即在答案框内输入你制作的网页的url，网页字符编码请用UTF-8），这个url能接受1个名为registerusername的参数，代表一个用户注册了该网站。</p>
<ul>
<li>如果该用户名还未被使用，那么返回"register success"。</li>
<li>否则返回 "already used"。</li>
</ul>
<p>用户访问url的形式举例: </p>
<ul>
<li><a target="_blank" href="http://121.201.63.168/train/register?registerusername=shinian">http://121.201.63.168/train/register?registerusername=shinian</a> (第一次访问，由于shinian没注册，返回 "register success")</li>
<li><a target="_blank" href="http://121.201.63.168/train/register?registerusername=shinian">http://121.201.63.168/train/register?registerusername=shinian</a> (第二次访问，由于shinian已经注册了，返回 "already used")</li>
<li><a target="_blank" href="http://121.201.63.168/train/register?registerusername=shinian">http://121.201.63.168/train/register?registerusername=jiaye</a> (第三次访问，由于jiaye没注册，返回 "register success")</li>
</ul>
<p>这里你提交的答案不需要带参数,只需提交: <a target="_blank" href="http://121.201.63.168/train/register">http://121.201.63.168/train/register</a> 即可</p>',
                    'answer' => 'noanswer',
                    'material' => '推荐大家使用mysql...这题是比较好的数据库的入门题。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-13 17:54:37',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 340,
                    'y' => 75,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 806,
                ),
            59 =>
                array (
                    'id' => 60,
                    'title' => '圆周率压缩法',
                    'content' => '<p>上次在群里(欢迎各位加群: 480394714)听各路大神讨论压缩算法，其中有个叫“圆周率压缩法”的算法
<img src="http://121.201.63.168/uploads/145000590097323.png" alt="" /></p>
<ul>
<li>不禁脑洞大开: <a target="_blank" href="https://en.wikipedia.org/wiki/Pi">π</a> 是一个无限不循环小数，理论上能表达出万物所有的信息。</li>
<li><img src="http://www.qlcoder.com/uploads/145000612390919.jpg" alt="" /></li>
<li>也就是说可以将数字串压缩为π小数点后第x位，再加上一个数字串长度即可表达该数字串。</li>
<li>例：
<ul>
<li><a href="https://en.wikipedia.org/wiki/Pi">π</a> = 3.1415926535898................</li>
<li>15926这段数字出现π小数点后第3位，将15926这段数字压缩为3,5两个数字即可</li>
<li>26535897这段出现π小数点后第6位，将26535897这段数字压缩为6,8两个数字即可</li>
</ul></li>
<li>问题：自然常数<a target="_blank" href="https://en.wikipedia.org/wiki/E_(mathematical_constant)">e</a>的前10位数字串 "2718281828" 用圆周率压缩法的表示方式。格式: "a,b"...如果有多种压缩方式，请选择压缩率最高的一种。(意味着压缩后的字符串长度最短)</li>
</ul>',
                    'answer' => 'noanswer',
                    'material' => '准备写个圆周率压缩法的压缩器,压缩出来的文件就叫xxx.π',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-13 20:38:58',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 940,
                    'y' => 300,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 5882,
                ),
            60 =>
                array (
                    'id' => 61,
                    'title' => '历史密文-1',
                    'content' => '<p>大家好，我是物联网方向的无线通讯工程师，目前主要负责基于zigbee协议的通信模块开发。
在我的整个工作中，编解码以及加解密都是很重要的。计算机发展了几十年，加密算法已经经过了非常多轮的迭代。</p>
<p>为了给后续的rsa,sha,des等等现代加密算法做一个铺垫。
今天我主要介绍下最最古老的两个加密算法。</p>
<h4>凯撒密码</h4>
<p><a target="_blank" href="https://zh.wikipedia.org/wiki/%E5%87%B1%E6%92%92%E5%AF%86%E7%A2%BC">凯撒密码</a>又称之为替换加密。在密码学中，恺撒密码（或称恺撒加密、恺撒变换、变换加密）是一种最简单且最广为人知的加密技术。它是一种替换加密的技术，明文中的所有字母都在字母表上向后（或向前）按照一个固定数目进行偏移后被替换成密文。例如，当偏移量是3的时候，所有的字母A将被替换成D，B变成E，以此类推。这个加密方法是以恺撒的名字命名的，当年恺撒曾用此方法与其将军们进行联系。</p>
<h5>凯撒密码应用举例</h5>
<ul>
<li>明文字母表：ABCDEFGHIJKLMNOPQRSTUVWXYZ</li>
<li>
<p>密文字母表：DEFGHIJKLMNOPQRSTUVWXYZABC</p>
</li>
<li>明文：THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG</li>
<li>密文：WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ</li>
</ul>
<h4>栅栏密码</h4>
<p>尽管名字看上去挺酷，不过很遗憾让大家失望了，栅栏密码也是很脆弱的。
所谓栅栏密码，就是把要加密的明文分成N个一组，然后把每组的第一个字母连起来，形成一段无规律的密文。</p>
<h5>栅栏密码应用举例</h5>
<ul>
<li>
<p>明文: "0123456789"  栅栏的长度设为4。</p>
<ul>
<li>那么把整个明文每4个一组:  "0123","4567","89"</li>
<li>取出每组的第1个字符  048</li>
<li>取出每组的第2个字符  159</li>
<li>取出每组的第3个字符  26</li>
<li>取出每组的第4个字符  37</li>
<li>最终的密文就是 0481592637。</li>
</ul>
</li>
</ul>
<p>下面有一段经过 凯撒密码和栅栏密码 双重加密的密文。
这题的答案藏在明文里。</p>
<pre><code>Gnykuto gc kl gxhaugyunkyzv, z srxtvg ggvozuvzcyooe ng, sv  ytk y kvkgvzrxtkrzejcykngb.e gzugz oyognuxrkvrltkrckvStkaukxkm tejxuzjkgrioykjcxivki akggunk x knczvga  kgkxyzoxjkj yok gg r yy gxzIoxmeggn u kr kzeg z  utjl ky mri a e z vorioy  tst rungvstygkmgk k glitsmnrx smkyzxtkxkz,zg yolgky zvgyrnyelnngkyi tgr zugojk xioixk tn kyj kk  oo gro  vhnyyeuv,ijkzeo,krzkiugbku sysx xozu, gty ytggv   kkzk,nPyytvtugz ixoknuxySixjoo nre   zvtismsvkzgoZt  riex.yrkglyvkix  iyokcaum yska ynlkgyYomkzggv sgikouk grngkay si.ixgt kmkkkkyzkk zk yj xz kogusutz.iun y k v kgyjzghuyrlnyxto.mgrioyxu guz, osjnuzsst iZgxrkzovln nks  g iekcnmykjjykkvyu zkr uz  h.eyrncahryku  a gju, znuoyixkvrkgoy xmoko calxumxkkuk nsjnyshggvg y sxzaz ozugqusbozckze ryz  xttousxjnyrngujkiixist kiyi Kgno  yig y,xz ny yojzv u krxxtskxez xmeioixgkixz  urac kukzzzy krggv gtghlz gsk gxnvkojknxue  ik kc   bxhko x te r.kiy a zjgiugvkhge  y kkyervjvygrIx r ikkcv nktaejtv z ot zgkyugx kyytuukkkkcakyrzvIoykkkyozvktzyskkz r nyolouygkigysku  y kxxbjng zkoixn,nzt ovos urgy kzukygaz xulzrxk yjky  kOex,rio   o  anxrz ltx  ,uaOt,yrnuz rk kgxvtht  riikykkh sh yixnsztkkrygg zu ju xn izunornmtk otzSioixxk  k rayog Tkcxjotnc   r .ennnut sgtxkxtzyzy mvt  . ky yIunriiy tihundrz,kytnqkukzz,tuaywer.kyacioixkkg grkxiio o  nost</code></pre>
<p>注意:这段密文总长度1277</p>',
                    'answer' => 'noanswer',
                    'material' => '凯撒密文还有一个升级版叫做维吉尼亚密码。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-14 19:48:04',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 200,
                    'y' => 180,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 1724,
                ),
            61 =>
                array (
                    'id' => 62,
                    'title' => '模仿游戏',
                    'content' => '<p><img src="http://121.201.63.168/uploads/145009451962828.jpg" alt="" />
<br>
今年强势上线的高分新片 <a target="_blank" href="http://movie.douban.com/subject/10463953/">模仿游戏</a>，主要介绍了关于图灵平生中的两件事情。</p>
<ul>
<li>第一件: 图灵是个gay。</li>
<li>第二件: 图灵带领团队破解了纳粹德国当时神一般的加密技术和加密机器:<a target="_blank" href="http://baike.baidu.com/link?url=AicRj2QqzithQsJYiooLi743WXSLf0bRp1hqMjAD7z1CwsH-a8J-O3pK9Ts-5_gomrVsvWBg_Ai1acfQBz6Yrq">enigma</a>.</li>
</ul>
<p>图灵团队的成果使纳粹德国的情报网遭到致命打击，挽救了无数士兵和难民的生命。因而于1945年获政府的最高奖——大英帝国荣誉勋章(O．B．E．勋章)，但最终还是因为当时的社会无法接受gay的存在，于1954年6月7日自杀于家中。天妒英才…</p>
<p>enigma，中文译名恩尼格玛密码机，是一个设计非常精密和巧妙的加密机器，为了方便大家理解，这里有一个在线的<a target="_blank" href="http://www.enigmaco.de/enigma/enigma.swf">enigma模拟网站</a></p>
<p>以下这段密文是通过上面的enigma模拟网站生成的，这题的答案就在里面。</p>
<pre><code>CPKJUCVAPYLWFTRYIBCPVOHVAVNJWNSEUQUNOISWWUWHJEFNUSBAVRVNNBMPECQLGCJISGHYOCQVVXVYKVWZOMFTKBMHSXLBLZIYYEBJQHYEKMBKJTLPHNHCSVANFTUQRJLXDAMLCPSNYZAYZBMFCLYMYPFXRMODTUODOFXVQMUJMBAATLYABFUMVPRDNJXILKYQXCJCHKCXZVCFSXTHUNTYZREUXVBJODKQCEKYGOXJAZTCYCMETCWQHCYAZGVWGNIRPFDUXADLEWJUMWDKTCFUFUHICPFXBADKBBLXAUIADSSJFNURSKAVQFGDWPPKLZEJGBEYVYXCPSOZESPANACFSARLWUTCQSIFRDWOCFEPWKJAEMMUEDYXPOHKIW</code></pre>',
                    'answer' => 'noanswer',
                    'material' => '这也许是人类史上最伟大的一次解密。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-14 22:17:33',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 140,
                    'y' => 180,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 6666,
                ),
            62 =>
                array (
                    'id' => 63,
                    'title' => '无边界地图',
                    'content' => '<p>大家好，我是xiuchuan，来千里码之后被众神碾压，难受得不行，心理变得越来越黑暗，最终鼓足勇气来准备贡献游戏方面的分支。游戏领域有非常多很有技巧性的知识点可以分享，这次我准备分享的是关于游戏地图的生成。</p>
<p>一般情况下，大家编写二维的游戏的时候，比如石器时代，星际争霸，坦克大战等，往往用一个二维数组去表示地图。</p>
<p>由于二维地图是有限的，因此当玩家的角色走到的地图的边界，就会切换成另一张相应的地图。（内存中导入另一个地图的二维数组）。</p>
<p><img src="http://www.qlcoder.com/uploads/145017915387956.jpg" alt="" /></p>
<p>魔兽世界是一款非常出色的游戏，从2004年开始无数玩家为之着迷。魔兽世界也是第一个引入无边界地图的游戏。这意味着，玩家一直往一个方向走，也永远不会走到地图的边界。其地图的实现方式已经跨越的传统的地图（二维数组表达，走到地图的边界切换成另一个二维数组）。</p>
<hr />
<p><a target="_blank"  href="https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">生命游戏</a>是一个经典的在二维地图上模拟生物演化的简单的小游戏。
在一个无边界的地图上，黄色代表生命体，灰色代表空地。初始状态如下图所示。</p>
<p><img src="http://121.201.63.168/uploads/145017871936742.png" alt="" /></p>
<p>他的规则非常简单。
在每次演化中:</p>
<ul>
<li>如果一个生命体周围少于2生命体，那么该生命体会因为人口缺少而在下一轮死去，这个格子变成了空地。</li>
<li>如果一个生命体周围大于3个生命体，那么该生命体会因为人口的过度拥挤，资源匮乏，而在下一轮死去。这个格子变成空地。</li>
<li>如果一个生命体周围有2-3个生命体，那么该生命体能在下一轮继续活下去。</li>
<li>如果一个空地周围有3个生命体，那么该空地在下一轮会繁殖出新的生命体。</li>
</ul>
<p>为了方便大家理解，在迭代了1轮之后，地图变成如下所示:</p>
<p><img src="http://121.201.63.168/uploads/145017878945111.png" alt="" /></p>
<p>在一个无边界的地图上，一个生命游戏的起始状态如上图所示（初始有5个生命体，剩下的都是空地），我想知道在接下来的无数次演化中，人口最多的时候，有多少个人口，最早发生在哪次迭代。
答案格式:"a-b"(迭代次数-人口数）。
在第1次迭代后，人口数变成6，那么提交的答案可以是 "1-6"。</p>',
                    'answer' => 'noanswer',
                    'material' => '为了部落！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-15 19:46:25',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 492,
                    'y' => 360,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 1315,
                ),
            63 =>
                array (
                    'id' => 64,
                    'title' => '3维地图-1',
                    'content' => '<p>游戏领域的发展从最初的2维（魂斗罗，坦克大战，超级玛丽）演化成2.5维（传奇），最终会变成纯3维。
目前有非常多的优秀的3d游戏:怪物猎人，GTA等大作。</p>
<p>3d游戏的核心当然是3d引擎，曾经网易游戏的大大大神云风写过一本书:<a  target="_blank" href="http://book.douban.com/subject/1441780/">游戏之旅-我的编程感悟</a>,这本书有一段提到云风读书时自己编写了3d引擎…被当时各个游戏开发团队所用…orz</p>
<p>由于这是一道3维地图模拟的入门题，不应该太难，所以今天的题目，整个3维地图非常小，x,y,z三个轴长度都是4，大小是4*4*4,总共64个区域，大家可以理解成一个魔方。</p>
<p><img src="http://121.201.63.168/uploads/145026230758194.jpg" alt="" /></p>
<p>好了，接下去要展示我为大家准备的9个素材,积木中的颜色只是为了让大家更好的理解，并没有实际意义。</p>
<p>请把这9个积木拼成一个魔方。</p>
<p><img src="http://www.qlcoder.com/uploads/145026517311773.png" alt="" /></p>
<p>当你把这9个积木拼成一个魔方后，
这个魔方的64个位置都会有一个编号为1-9的数字，代表这个位置属于以上9块积木中的具体某一块。</p>
<p>那么这个方案可以表达成一个长度为64的10进制大整数，这个整数的每位都是一个1-9的数字，</p>
<p>举例: 如果这个魔方的（a,b,c）位置正好是第6块积木中的某1小块，那么这个整数的第 16*a+4*b+c 位是6.
a,b,c的取值范围是一个0-3的整数。（0,1,2,3）。</p>
<p>这题的答案是所有方案的整数的和。</p>',
                    'answer' => 'noanswer',
                    'material' => '之前在网易,那个时候正好云风离职单干，无意间看到云风在转公积金，如果我没看错的话，好像是7位数...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-16 18:32:10',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 450,
                    'y' => 470,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 10000,
                ),
            64 =>
                array (
                    'id' => 65,
                    'title' => '可视化-1',
                    'content' => '<p>作为一个数据挖掘工程师，我在工作中很多时候需要自己做图，让其他运营同事更直观的理解用户沉淀在网站上的行为数据。这个过程我们称之为数据可视化，这可是大数据分析中很重要的一个环节。有道是一图胜千言，无图无真相。</p>
<p><img src="http://121.201.63.168/uploads/145035198038693.jpg" alt="" /></p>
<p>目前数据可视化有非常多实用的工具，我在工作中主要用的是<a target="_blank" href="https://www.r-project.org/">R</a>，它能集数据分析和可视化于一身，比matlab好用呢，而且开源免费…</p>
<p><a href="http://121.201.63.168/download/145035182953188.txt">这个文件</a>包含1万行，
每行有两个数，代表一个小圆的圆心位置，圆的半径统一是5..</p>
<p>当你把这些小圆画出来，就可以很直观的看到答案了。</p>',
                    'answer' => 'noanswer',
                    'material' => '我在工作中做了一套自动化的根据数据生成相应图片，并生成相应邮件的系统，公司的运营可以选择订阅这套系统，这样他们会在每天早上收到数据邮件，并很直观的评估出自己在内容运营和推广上的成果。每每新入职的同事，我就告诉他们这些邮件是我每天早上爬起来专门整理好发的，他们都感激涕零，排队请我吃饭。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-17 19:35:52',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 630,
                    'y' => 313,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 510,
                ),
            65 =>
                array (
                    'id' => 66,
                    'title' => 'base64',
                    'content' => '<p>很多时候，我们需要把二进制文件的内容放在url或者作为get和post的参数传递。</p>
<p>用记事本打开exe、jpg、pdf这些文件时，我们都会看到一大堆乱码，因为二进制文件包含很多无法显示和打印的字符，所以，如果要让记事本这样的文本处理软件能处理二进制数据，就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。</p>
<p>Base64是一种用64个字符来表示任意二进制数据的方法。</p>
<p>阮一峰老师有一篇关于base64讲解得比较详细的文章。在这里我附带上<a target="_blank" href="http://www.ruanyifeng.com/blog/2008/06/base64.html">传送门</a>。</p>
<p>目前base64的运用十分广泛。
<br>
<img src="http://www.qlcoder.com/uploads/145043519719366.png" alt="" /></p>
<p>迅雷，qq旋风等下载链接，均用的是base64编码。</p>
<p>下面是一段内容由base编码，解码后能看到本题的答案。</p>
<pre><code>/9j/4QAwRXhpZgAATU0AKgAAAAgAAQExAAIAAAAOAAAAGgAAAAB3d3cubWVpdHUuY29tAP/bAEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwHCQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAGQAZAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP38oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAPCvgT/AMFGPhl+0JJ4GGj3HibTo/ibZtf+ErjWfDt7p1p4ijWD7SRb3EkYhaXyA0ohLiVo45XVCsblQDc+DX7ZHhj49+JJrHw1pPjO7s7fVtS0STV5NBuIdLW60+4ntbpPtDAJhZ7aWMHozKME5FAFvQv2s/DHi3xKLDRbDxhrdp/aK6UdXsPDl7PpXnkhTtuRHseJW4eZC0SFWDOCpwATW37U/hl/iLpXhu6tfE2lXHiDUbnSNJu9R0O5tLLU7uCKWaSGKWRACTHBO6M2FlWJjGzjBIBHof7XPgjX/H2m+Hor6+hm13UbvR9IvbixlhsNYvrVJXuLW2nZQksqJBcNhThhbzFSwjbABrXv7Qfhey+PVj8NWvJ38WX2lTaysCW7tDFbxOiNvlxsVyZFIQncRzjHNAHP/Cj9s/wL8aPEOlWOhXGtyQeIlu30PUrnRbu107XltmKzNaXEkaxyrgF0IOJogZYvMjG+gD1agAoAKACgAoAKAPzo/wCCdfwd8U/CD9mn9jfWvHlt4k8TaDpPhfTdNg0q802K1m+Gusy6XLbJeyRokcrxvHNNYv5od4WnjbAVpnUA9A/4J4/s0eObP4I+P724+IvxE0iLXfGXxCjsPCF9p+lW+kWBufEurG3vI3+wLqJ3qyXClrt0bzsqpQooAPUf2Rv2gNC8H/BrwD8P9W8O+JfCXi7QNPsPDl3oCeG7+SCxuIoUhYxzRwGF7QMuVuQ3lbcFmU5AAMLwl8cvDv7VP7S2gz6jPr2k6Z4G1i6bwxo82kajay6rqKw3Fo+oXTmJYhAsUk4giZiG8wTN84iWMA5D4VWGtR/CP4C/CuPSvEGreO/h3rqf2/fX+nyW1vZf2faXatqE0+xY2ju5WhRPJ3NJ9sJVNqSmMAvfD74QfEz4fftY/Cz/AISLR/B+pT6hpfiS78T67YX14/8AaF1cHShJKyvb4j+WJI4YWkIWKFUDYiGQDn/hX+zJHF8Vv2ePCngjxZ4m1j4f/s/6xd6na22oaFJaRaRp6aJqOkWthJdSIrz3CNeoE/iEMEhkDMyOwB9yUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB//Z</code></pre>',
                    'answer' => 'noanswer',
                    'material' => '由于历史原因，Email只被允许传送ASCII字符，即一个8位字节的低7位。因此，如果您发送了一封带有非ASCII字符（即字节的最高位是1）的Email通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0...关于这个大家可以参考RFC2046。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-18 18:48:12',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 720,
                    'y' => 203,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 523,
                ),
            66 =>
                array (
                    'id' => 67,
                    'title' => '碰撞检测-1',
                    'content' => '<p>碰撞检测是游戏开发的基本功。我相信现在基本只要是个游戏就会用到碰撞检测吧。
这里有关于云风大神在实战中介绍的<a  target="_blank" href="http://blog.codingnow.com/2006/12/collision.html">3d碰撞检测</a>。</p>
<p><img src="http://www.qlcoder.com/uploads/145052542850067.png" alt="" /></p>
<p><a  target="_blank" href="http://www.cnblogs.com/kenkofox/archive/2011/09/06/2168944.html">这个博客</a>里有一个比较好的小球碰撞的demo。</p>
<p>在一个1000*1000cm的矩形中，有9个小球，小球的半径为5cm，小球绝对刚性，整个系统中不需要考虑摩擦力。
每次碰撞均符合动量守恒定律和动能守恒定律。</p>
<p>接下去有9行，每行4个整数。分别代表9个小球的初始状态。
前2个数字代表小球初始的圆心坐标(x,y)。</p>
<p>后面两个数字代表小球x轴的速度和y轴的速度(a,b),单位cm/s。
速度为正，代表朝着坐标轴正方向运行，速度为负反之。</p>
<p>每个小球的初始坐标和初始速度如下:</p>
<ul>
<li>10 10 1 2</li>
<li>20 20 3 4</li>
<li>30 30 5 6</li>
<li>40 40 7 8</li>
<li>50 50 9 10</li>
<li>60 60 -11 -12</li>
<li>70 70 -13 -14</li>
<li>80 80 -15 -16</li>
<li>90 90 -17 -18</li>
</ul>
<p>请问，经过10分钟后，第一个小球的精确的坐标。（精确到小数点后3位）格式:a,b 。</p>',
                    'answer' => 'noanswer',
                    'material' => '碰撞检测需要非常深的计算几何的基本功，尤其是3维碰撞检测，和凸包等等都有很大的关系。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-19 19:53:36',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 440,
                    'y' => 420,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 10000,
                ),
            67 =>
                array (
                    'id' => 68,
                    'title' => '拼图-2',
                    'content' => '<p>此题除了文件之外和<a target="_blank" href="http://www.qlcoder.com/task/759c">上题</a>完全一致,第一个拼出全图得到答案的coder奖励poker3一把。
<a href="http://www.qlcoder.com/download/manypieces.zip">文件传送门</a>。</p>',
                    'answer' => 'noanswer',
                    'material' => 'you shall not pass !!!',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-20 16:49:48',
                    'updated_at' => '2016-04-25 17:26:15',
                    'author' => '82638883@163.com',
                    'x' => 730,
                    'y' => 490,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 25000,
                ),
            68 =>
                array (
                    'id' => 69,
                    'title' => 'Share',
                    'content' => '<p>你好，我是千里码的开发者食年。</p>
<p>当你打开这个task时，你已经是一只万里码啦~ 谨此，我代表千里码团队恭喜你已成为某技术领域的大牛，或者已具备成为大牛的潜质！</p>
<p>我也是coder出身，之所以创建千里码，是源于之前的一段工作经历。</p>
<p>我曾就职于<a target="_blank" href="http://www.mogujie.com">蘑菇街</a>，负责蘑菇街算法方向的团队建设。在蘑菇街的三年时间里，亲历了蘑菇街从几十号人，迅速发展到700号人的过程。在最后的1年半时间，我每天都需要查看20个左右的简历，然后电话面试、初试、复试，近60%的时间投入到了招聘工作中。</p>
<p>但遗憾的是，挖掘到优秀的coder的速度依然很慢。我平均1个月面试100+人，但团队依然是每个月1-2人的速度扩张，可以说是百里挑一。这个百里挑一，并非因为蘑菇街的用人标准过高，其症结在于: 优秀的coder太少了。</p>
<p>导致这种结果的原因主要有两方面：</p>
<p>一方面，现在中国的教育体制，很难培养出优秀的coder。这个我相信大家感同深受。国家的一个教材的制定审核流程，使得教材更新一版可能需要数年，远远低于互联网的发展速度。我依稀记得我读大学的时候，在语言方面，我校用的教材在教pascal和vb。而当时java，python，ruby都已经如日中天了。在算法方面，google的三大论文已经出世，很明显的大数据时代已经到来，各种并发，协同，集群方面的知识，学校的教材也根本没有涉猎。这直接了导致很多同学不知道学什么，甚至学了都没法直接在工作中运用。</p>
<p>另一个方面，从我自身的工作经验出发，我曾经负责蘑菇街的反作弊体系、排序算法体系的规划和建设。由于是刚起步的阶段，我多次带领团队和各大公司进行公开的交流，其中不乏baidu，alibaba，美团，京东的技术团队，但都会因为商业竞争，商业机密等各种原因，进行得不是很顺利。</p>
<p>这直接导致了一个很不好的局面: 大部分coder在一个很长的时间段内，没能找到一个合适的技术方向去投入自己的时间，把自己的才能发挥出来。继而，亟需用人的公司，也无法招到更优秀的coder。</p>
<p>在这里，千里码团队希望你能贡献出你的一份知识和力量，把你工作中，学习中认为很重要的知识点，以task的形式发送给我们的官方邮箱：<strong>oreo@qlcoder.com</strong>，帮助我们一起完善社区的技能树。我们会第一时间跟您讨论该task的position，知识点的覆盖，难度以及学习资料方面等细节，同时会把您的资料放在task板块的右上角。</p>
<p>这题不需要提交答案，我们收到题目的第一时间会把您技能树的题目设置通过。若您的题目被千里码使用，我们将联系您，并<strong>赠送给您一个机械键盘——ikbc poker3</strong>，详见ikbc poker3附图。</p>
<p>再次感谢您对千里码的支持。</p>
<p>——食年 2015.08.08</p>
<p><strong>附表：</strong>题目贡献者，排名不分先后，定期更新</p>
<ul>
<li>玉龙 | 蚂蚁金服 支付宝微贷事业部高级开发工程师 | <a target="_blank" href="http://www.qlcoder.com/task/752a">访客统计</a> <a target="_blank" href="http://www.qlcoder.com/task/758a">访客统计2</a> <a target="_blank" href="http://www.qlcoder.com/task/75a8">访客统计3</a></li>
<li>朱丽霖 | 百度 人力资源-技术岗 | <a target="_blank" href="http://www.qlcoder.com/task/7530">cookie</a> <a target="_blank" href="http://www.qlcoder.com/task/7593">缺失的后缀</a></li>
<li>李润哲 | 蘑菇街 安全团队负责人 | <a target="_blank" href="http://www.qlcoder.com/task/7533">数据脱敏</a> <a target="_blank" href="http://www.qlcoder.com/task/75ab">openssl</a></li>
<li>金洪 | 去哪儿网 人力资源-技术岗 | <a  target="_blank" href="http://www.qlcoder.com/task/7536">sql注入</a> <a  target="_blank" href="http://www.qlcoder.com/task/7572">sql注入-2</a></li>
<li>Evan | 美团 Android技术经理 | <a target="_blank" href="http://www.qlcoder.com/task/753c">跑马灯</a></li>
<li>妙风 | 天猫 技术专家 | <a target="_blank" href="http://www.qlcoder.com/task/753f">商品数量-1</a> <a target="_blank" href="http://www.qlcoder.com/task/7542">商品数量-2</a></li>
<li>李凌 | 腾讯 社交网络事业群招聘经理 | <a  target="_blank" href="http://www.qlcoder.com/task/7545">热点营销-1</a> <a target="_blank" href="http://www.qlcoder.com/task/7548">热点营销-2</a></li>
<li>蔡超凡 | 迅雷科技 基础研发主管 | <a target="_blank" href="http://www.qlcoder.com/task/754b">断点续传</a></li>
<li>王图勇 | 新浪 财经科技事业部技术总监 | <a  target="_blank" href="http://www.qlcoder.com/task/754e">我从哪里来</a></li>
<li>骆兆杰 | 美图秀秀 IOS Engineer | <a  target="_blank" href="http://www.qlcoder.com/task/7554">以图搜图-1</a> <a  target="_blank" href="http://www.qlcoder.com/task/75b1">以图搜图-2</a></li>
<li>谢印超 | 360安全卫士研发工程师 | <a  target="_blank" href="http://www.qlcoder.com/task/755a">文件管理</a></li>
<li>吴永巍 | 百度 网页搜索部架构师 | <a  target="_blank" href="http://www.qlcoder.com/task/7560">爬虫-1</a> <a target="_blank" href="http://www.qlcoder.com/task/7563">爬虫-2</a> <a  target="_blank" href="http://www.qlcoder.com/task/7569">爬虫-3</a> <a  target="_blank" href="http://www.qlcoder.com/task/757e">爬虫-5</a></li>
<li>Hans | 顺丰海淘 技术岗hr | <a  target="_blank" href="http://www.qlcoder.com/task/7566">老王装货</a></li>
<li>黄飞虎 | 我党 有关部门 | <a target="_blank" href="http://www.qlcoder.com/task/7575">逆向工程-begin</a> <a target="_blank" href="http://www.qlcoder.com/task/758d">java反编译</a></li>
<li>zzliux |  <a target="_blank" href="http://www.qlcoder.com/task/7578">basic 正则表达式</a></li>
<li>若远 | 阿里巴巴 淘海外 移动事业部 反作弊专家 | <a target="_blank" href="http://www.qlcoder.com/task/7581">喜刷刷</a></li>
<li>Marguerite | 优步中国 Software Engineer | <a target="_blank" href="http://www.qlcoder.com/task/7596">打车匹配</a></li>
<li>歌者 | 阿里巴巴 一淘事业部 降临派首脑 | <a target="_blank" href="http://www.qlcoder.com/task/7599">新词发现</a></li>
<li>bsguedes | Porto Alegre postal service Computer Engineer | <a target="_blank" href="http://www.qlcoder.com/task/759c">拼图</a><a target="_blank" href="http://www.qlcoder.com/task/75e7">拼图-2</a></li>
<li>BluesCode | 前端开发工程师 | <a target="_blank" href="http://www.qlcoder.com/task/75a2">html5</a></li>
<li>苏捷 | 优酷 flash开发工程师 | <a target="_blank" href="http://www.qlcoder.com/task/75b7">bgm</a></li>
<li>saltless | 腾讯 微信事业部 交易型业务后台开发工程师 | <a target="_blank" href="http://www.qlcoder.com/task/75c0">QR Code</a></li>
<li>bok | midomi Audio Software Engineer | <a target="_blank" href="http://www.qlcoder.com/task/75c6">语音识别-1</a></li>
<li>julytail | 蘑菇街 打杂 | <a target="_blank" href="http://www.qlcoder.com/task/75cf">圆周率压缩法</a> <a target="_blank" href="http://www.qlcoder.com/task/75de">可视化-1</a> <a target="_blank" href="http://www.qlcoder.com/task/760e">数据挖掘-Warmup</a></li>
<li>阿炳 | 东方通信 无线通信工程师 | <a target="_blank" href="http://www.qlcoder.com/task/75d2">历史密文-1</a> <a target="_blank" href="http',
                    'answer' => 'oreo is a option dog',
                    'material' => '授人以鱼不如授人以渔',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-29 16:50:10',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => 'han.ze@qq.com',
                    'x' => 228,
                    'y' => 55,
                    'contributor' => 11,
                    'study' => '授人以鱼不如授人以渔',
                    'score' => 0,
                ),
            69 =>
                array (
                    'id' => 70,
                    'title' => '历史密文-2',
                    'content' => '<p>Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。该系列的游戏不但画面和内容不错，而且即使计算机配置低，也能极其流畅地运行。</p>
<p><img src="http://121.201.63.168/uploads/145069253363257.jpg" alt="" /></p>
<p>雷神之锤三的源码目前已公开，其中有一段广为人知的<a target="_blank" href="http://my.oschina.net/lmw/blog/366377">关于平方根倒数速算法</a>。</p>
<p>当然这里我们要介绍的并不是如何开平方根。</p>
<p>由于90年代计算机配置极低，因此涉及到加密算法的地方，也需要非常快的运算速度。
oh，还有什么比<a target="_blank" href="http://baike.baidu.com/link?url=CzHaZ0rK_6dXqwCxNIhB9iaKO3Pc5LzwTgnW6KyxxFkpRyX1cTyjYpCC8Jn-8DaEAAkeH3W9j_XGQaHXKYnbSq">位运算</a>来得更快的呢~！！！</p>
<p>以下是该加密算法的代码，分别提供了<a href="http://121.201.63.168/uploads/75ed.cpp">c++版本</a>（感谢dploop），<a href="http://121.201.63.168/download/75ed.java">java版本</a>(感谢shinian)，<a href="http://121.201.63.168/download/75ed.py">python版本</a>（感谢马猴饲养员）。</p>
<p>该加密算法用了1个长度为4的byte数组作为key。</p>
<p>例子中比较明显，当key的取值为11,22,33,44的时候，"hello,world!"被加密成为了"5b0dcfc68c8d58e9c5680e4c"。</p>
<p>下面这段是用该算法加密后的密文，key什么的我肯定不会告诉你的。这题的答案就在明文里。
密文长度1968。</p>
<pre><code>bb2af286e3ec8ead77cf81d0e7299fef8fd0a3837a4621fef3827dd0887c51aa168b4f0953aa3f070dfffc2cb0df8afdbdacbddce28165efe57ceac945cde63c28d23ce6e927a9f2624b4f8683fa51e8683da6fdaba13a2b055d0b2f7e0583f299081139027275089311cc6b112a124f85d3070dff6b237d53aa1f51805ed3aa3efd66e4dce2eb50ea29870dfffe26f4e66988116041b12073dda2f71d2292e381305ce28baf8dd3c643e1f92c90b1a45f1c86d6190e700ba932838d7794205669c54591205329eb468683fac9095e85c3cc51e868d1a05e6a4b4b8683fabb2af286e3ece9e546d02e504f85d36b0b5f6aa532bdacbde38530dce2e1130a12254fc8e9213751e868eb2137b1406ca72dff4601ff4aaf32a3837ad38a1f71827d7024139d22da5f64c56769c962215e0bab721340447c88fe5da29dd8805e6a412b6b237f590e33d16c464aaf327904132f89f0fc8adea589d2e8a550f50ed2250fdedcca814d095f990a334643a8ddaafdd0887ceb21175ca2bfd1a05ea9eb46d0887cc723d7bd28b2caaf30bf86ffdce2eb7faadfff46e45ce28b1f42a54603ff750eb305079658c2ab2ba313072dff6b237d53aa1f7f66e5d1c04fbfaeded1a05ab4267a152a12ea4361caaf324601ff6b2b5d8683fa1ca4dea6a9f2a60fdd690b5fd1aa3e5de280af89d28be925c643a1c5c5c6e729dcd90c50c723d73c2ad2ea21371d22923508923d2ad0d34e46620b5d8683fa71a05d8b2f3d3c2a92190830536c659ca4dc91281370827d7e26f3eb4b4bd0887ceb211705e3e61f84deeb6121d36c4490005245ede406a3f33d86fe074deb502e50620b5d71a05d53aa1f3508d2d3887ed0805fc643c167299ff0a0775ca2bf5da2d64f85d3d1805ffd8a9f50c82951805e7cea892a255e050dff6b237d53aa1fff66e6e9233ef50ed023813045c5c4b1ac5edfa2fd4aaf324f85d3870dfdbcee887daad63c4ae55f04d3e7618fbfaeded1a05ab4267a152a12ea4361aaa13abd2a92a6a9d227c9c4790413a3837a7ccae8ebc5467904122381536ba77250ea08936044c643c1716405d3887eea41216a237d53aa1f750e937ccac92a47608f85d33da6ff27a9f2b50ab2a9eb4586a3b3f08077930a12102a32870dffc4adf0fdaa9e7daabfa9c12c256fe80e0dffea610149095f438f5385e1ccc585d0df8ad7918e5d916a0507c3e48f81d33da6ff27a9f2a589d292205245ede4dfa2971d22926385533deec94aaf3258c04ca7a991af89d306e3e48f81d3bda6ffe5cfc67f06f2a9c366e68fd2936044c643c18b4f09e92137dce2814621fef3827dd0887c0727b649095f4f85d33f6aa4934045ff66e331426650ea4929c366702413604bce</code></pre>',
                    'answer' => 'noanswer',
                    'material' => '雷神之锤的源码就好像宝藏一样...能发现非常多那个年代才有的极限的性能优化。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-21 19:29:59',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 250,
                    'y' => 244,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 3703,
                ),
            70 =>
                array (
                    'id' => 71,
                    'title' => '真·历史密文-2',
                    'content' => '<p>Quake-III Arena (雷神之锤3)里怎么可能用那么弱智的加密方式,上一题是…教学题，
Quake-III用的真正的加密方式和上一题的唯一区别在于，key是1个16位的byte数组。
整个加密的方式和上题保持一致。</p>
<p><strong> 唯一的区别: key数组的长度从4变成了16,因此代码中的<code>temp&3</code>改成<code>temp&15</code>,其余保持不变。</strong></p>
<p>下面这段是用该算法加密后的密文，key什么的我肯定不会告诉你的。这题的答案就在明文里。
密文的长度为216。</p>
<pre><code>c49adf6e64df5a31a4752e87da5c3e268378e7a4c8c6e7bbfb99a25e5e3ee4b83a2e8cf1c39f5cc484bf4e87b1c66cd764e4f1666356f7cef9c568d8527995278f8256061597c631942d99abfb9f72819846f09fa62c862764d7f9b983fd8a5047d81dcea89427b0a4fc4257</code></pre>',
                    'answer' => 'justforfaint',
                    'material' => '这题的后面有一道bonus是mac的题目...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-21 21:50:08',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 165,
                    'y' => 244,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 25000,
                ),
            71 =>
                array (
                    'id' => 72,
                    'title' => 'Hello, World!',
                    'content' => '<p><img src="http://www.qlcoder.com/uploads/145078410214902.jpg" alt="" /></p>
<p>NASA（美国航空航天局）是美国联邦政府的一个政府机构，成立于1958年10月1日，主要负责美国的太空计划，其研究计划有：水星计划、双子星计划、阿波罗计划、太空实验室、航天飞机、国际空间站（与俄罗斯、加拿大、欧洲、Rosaviakosmos以及日本宇宙开发局合作）、星座计划等。</p>
<p>阿波罗上面用的导航计算机主频2.048MHz，2048字的RAM，36864字的ROM，现在casio计算器的主频都有30MHz。航天飞机上的飞控计算机处理速度只有0.4MIPS，不到Xbox处理速度的百分之一。</p>
<p>其中，在阿波罗计划实行的过程中，由于计算机资源匮乏，无法进行大量的存储和计算，所以对于程序员的选拨要求非常高非常高。彼时的选拨场景跟现在校招有点类似，出几个题目，被选拔者使用规定的语言实现，然后选出代码最短的，占用资源最少的程序员。</p>
<p>在下面，你需要了解当年nasa招聘coder所用的语言。为了简化问题，qlcoder把语言更精炼化了一些。</p>
<p>并用该语言写出一个程序，该程序能输出 <code>Hello, World!</code>。
<a target="_blank" href="http://www.qlcoder.com/train/qlla">语言的链接传送门</a>。</p>
<p>请提交你的代码来通过此题。</p>',
                    'answer' => 'noanswer',
                    'material' => '我以后要强行吹逼:『一晚上写了个程序语言的解释器。』',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-22 18:59:14',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 670,
                    'y' => 120,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 100,
                ),
            72 =>
                array (
                    'id' => 73,
                    'title' => '斐波那契',
                    'content' => '<p>斐波那契数列（Fibonacci sequence），又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入，故又称为“兔子数列”，指的是这样一个数列：0、1、1、2、3、5、8、13、21、34、……在数学上，斐波纳契数列以如下被以递归的方法定义：F（0）=0，F（1）=1，F（n）=F(n-1)+F(n-2)（n≥2，n∈N*）在现代物理、准晶体结构、化学等领域，斐波纳契数列都有直接的应用，为此，美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志，用于专门刊载这方面的研究成果。</p>
<p><a target="_blank" href="http://www.qlcoder.com/train/qllb">qll-beta</a>在qll-alpha的基础上增加了内存读写。</p>
<p>请用<a target="_blank"  href="http://www.qlcoder.com/train/qllb">qll-beta</a>写一个程序，该程序输出斐波那契数列的前43项，中间用逗号隔开。本题只接受长度小于120的代码</p>
<p>举例:"0,1,1,2,3..."</p>
<p>请提交你的代码来通过此题。 </p>',
                    'answer' => 'noanswer',
                    'material' => '什么？听说你不会循环？循环可是很重要的编程技巧呢',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-22 19:57:25',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 750,
                    'y' => 120,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 100,
                ),
            73 =>
                array (
                    'id' => 74,
                    'title' => '函数式编程-1',
                    'content' => '<h3>函数式编程</h3>
<p>诞生50多年之后，函数式编程（functional programming）开始获得越来越多的关注。</p>
<p>不仅最古老的函数式语言Lisp重获青春，而且新的函数式语言层出不穷，比如Erlang、clojure、Scala、F#等等。目前最当红的Python、Ruby、Javascript，对函数式编程的支持都很强，就连老牌的面向对象的Java、面向过程的PHP，都忙不迭地加入对匿名函数的支持。越来越多的迹象表明，函数式编程已经不再是学术界的最爱，开始大踏步地在业界投入实用。</p>
<ul>
<li>目前国内主流大公司均引入了函数式编程语言作为重要环节的开发语言。</li>
<li>java8也开始支持匿名函数和Lambda表达式。</li>
<li>java虚拟机下的函数式语言clojure写的实时计算框架<a target="_blank" href="http://storm.apache.org/">storm</a>被apache收编，是实时计算方面的明星项目。</li>
<li>轻量级的分布式框架<a target="_blank"  href="http://akka.io/">akka</a>由scala编写。</li>
<li>大名鼎鼎的<a target="_blank"  href="http://spark.apache.org">spark</a>！！！也是由scala编写。</li>
</ul>
<p>随着大数据时代以及多核时代的到来，函数式语言的无副作用和优雅的编程范式必然会越来越受到重视。</p>
<p>这里有一篇比较好的阮一峰老师介绍<a target="_blank"  href="http://www.ruanyifeng.com/blog/2012/04/functional_programming.html">函数式编程的入门文章</a>。</p>
<p>大名鼎鼎的<a target="_blank"  href="http://book.douban.com/subject/1148282/?from=tag_all">SICP</a>,采用了scheme作为其示例代码。
<img src="http://121.201.63.168/uploads/145087079076286.jpg" alt="" /></p>
<p>下面是一段lisp系的代码，这题的答案是这段代码的结果。</p>
<pre><code>(define (gao n)
(do ((d (do ((i (- n 1) (- i 1))
(d \'() (cons i d)))
((< i 0) d))
(append (cddr d) (list (car d)))))
((null? (cdr d)) (car d))))
(display (gao 987654321))</code></pre>',
                    'answer' => 'noanswer',
                    'material' => '图片中的人物，是写lisp的大神，田春冰河，人称伞哥。对国内lisp社区做出了巨大的贡献。因此千里码找了伞哥最帅的照片一张，希望帮伞哥求得一段新的姻(ji)缘(qing)。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-23 19:37:55',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 520,
                    'y' => 128,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 1369,
                ),
            74 =>
                array (
                    'id' => 75,
                    'title' => '人生赢家',
                    'content' => '<p>首先恭喜你，你已经能享受markdown带来的美好了。</p>
<p>比markdown更美好的还有什么呢？</p>
<p>当然是另一半啦！！</p>
<p>能和自己心仪的女神(男神)在一起，那真是三生有幸。</p>
<p>一个优秀的，健康向上的妹子(汉子)，不仅仅会使你的代码功底，更会使你整个人生得到升华。</p>
<p>不只是针对coder，对任何人来说，这都是一件非常重要的的事情。</p>
<p>重要性远远高于语言，开发环境…</p>
<p>一个私人的程序员鼓励师，这是多么美好的事情。</p>
<p>找到另一半的方式有非常多。请自行google，baidu，或者围观千里码的大神的学习资料。</p>
<p>请找到一个妹子（汉子），然后让Ta成为你的另一半。</p>
<p>并将你们的合照发至oreo@qlcoder.com,合照中双方要合持1张A4纸，上面写着你在qlcoder的用户名。</p>
<p>为了保护你的隐私，可以将双方的脸马赛克化，只要合持的A4纸字迹清晰，无ps痕迹，双方一个男装，一个女装即可。（求别拿基佬小伙伴伪装来作弊！）</p>
<p>我们收到邮件的第一时间会给你设置通过。通过此题的用户能得到[人生赢家]的勋章一枚。会在排行榜中体现出来。</p>',
                    'answer' => 'noanswer',
                    'material' => 'Hail FFF!',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-24 19:43:43',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 700,
                    'y' => 155,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 5263,
                ),
            75 =>
                array (
                    'id' => 76,
                    'title' => '高阶函数',
                    'content' => '<p>一般的函数，是用作处理数据的。
直白一点说，就是，函数的输入是数据，函数的输出也是数据。</p>
<p>高阶函数，是函数式编程中的基本功。</p>
<p>所谓高阶函数，是处理函数的函数。函数的输入是函数，函数的输出也是函数。</p>
<p>关于如何正确的在工作和项目中使用高阶函数，以及使用的好处和意义。目前竟然没有深得我心的文章，我之后再补。</p>
<hr />
<p>//以下其实有2000字</p>
<h4>论高阶函数</h4>
<p>…</p>
<p>…</p>
<p>…</p>
<hr />
<p>高阶函数中，有一种最特别的高阶函数，它没有输入，输出的是该函数本身。这种函数就好像能自我复制一样，业界称之为<a target="_blank" href="https://en.wikipedia.org/wiki/Quine_(computing)">Quine</a>。</p>
<p>下图为Turritopsis nutricula,它在性成熟后会重新回到水螅型(Polyp)状态，并且可以无限重复这一过程，从而拥有了返老还童的能力。</p>
<p><img src="http://www.qlcoder.com/uploads/145104410832161.jpg" alt="" /></p>
<p>请用<a  target="_blank" href="/train/qllv1">qllv1.0</a> 写一个qll版的quine，它的输出是代码本身。</p>
<p>这意味着如果你的代码作为字符串A,长度为100，程序输出的字符串B,长度也为100，AB两个字符串完全相等。</p>
<p>为了保护服务器端qll解释器避免死循环，本题只接受执行指令数小于10000的代码，大于10000的代码作为死循环强制kill。</p>
<p>通过此题并且代码长度小于170的用户，将得到 qll-master的勋章一枚。</p>',
                    'answer' => 'noanswer',
                    'material' => '拥有qll-master勋章的用户享有以下特权:如果bat等公司招聘qll工程师,将有免笔试免面试免试用的优先录用权。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-25 19:19:00',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 830,
                    'y' => 90,
                    'contributor' => 8,
                    'study' => '',
                    'score' => 100,
                ),
            76 =>
                array (
                    'id' => 77,
                    'title' => '碰撞检测-2',
                    'content' => '<p>此题和<a target="_blank" href="/task/75e4">上题</a>唯一的区别，执行十分钟变成了执行1周。其余所有条件保持一致。</p>',
                    'answer' => 'noanswer',
                    'material' => '对于高精度计算的一些坑点和优化点来说...学习资料已经讲得比较清楚了...各位可以看看',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-26 19:42:09',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 410,
                    'y' => 505,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 14285,
                ),
            77 =>
                array (
                    'id' => 78,
                    'title' => 'json&xml',
                    'content' => '<p>json&xml</p>
<p><a target="_blank" href="http://baike.baidu.com/link?url=C4L65H1SN7tNeHKftGJj-OCzSCAPoXU9HUqjJqcP8caDKsGRJ1NAN6qD2t7ZuCZwn5pvOt9mt0iw1jb3-2xnoK">json</a>和<a target="_blank"  href="http://baike.baidu.com/link?url=F9UGqRKO6an8MFdWArfK_Jxi-g6AZy9OMtRpehjYb2Tq9c7OHZz3_jb5QLoN4xGsPNJ9JeoHQq5j5GKAqA_5CcNr_P1-U7Wm5ZHONQP8DU2IWedXkFXSvFpqgysz_u7Y">xml</a>是目前最通用的数据格式。</p>
<p>在工作中用HTTP传输数据,往往就会用json和xml中的一种作为数据格式。</p>
<p>apache基金会下的主流项目,比如搜索框架solr,基本都会提供了wt=json和wt=xml两种数据格式。</p>
<p>你可以通过<a target="_blank"  href="http://www.w3school.com.cn/xml">w3cxml</a>来了解xml。</p>
<p>也可以通过<a target="_blank"  href="http://www.w3school.com.cn/json/">w3cjson</a>来了解json。</p>
<p>下面是一个用xml描述的数据。</p>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;name&gt;Sayalic&lt;/name&gt;
&lt;age&gt;25&lt;/age&gt;
&lt;girlfriend&gt;null&lt;/girlfriend&gt;
&lt;gayfriend&gt;
&lt;age&gt;24.5&lt;/age&gt;
&lt;name&gt;dploop&lt;/name&gt;
&lt;FavoriteFruits&gt;pear&lt;/FavoriteFruits&gt;
&lt;FavoriteFruits&gt;lemon&lt;/FavoriteFruits&gt;
&lt;/gayfriend&gt;
&lt;FavoriteFruits&gt;orange&lt;/FavoriteFruits&gt;
&lt;FavoriteFruits&gt;banana&lt;/FavoriteFruits&gt;
&lt;FavoriteFruits&gt;apple&lt;/FavoriteFruits&gt;</code></pre>
<p>请把它转成json格式,本题的答案是该json字符串。</p>',
                    'answer' => 'noanswer',
                    'material' => 'json和xml也可以作为通用的序列化的格式。但是由于其占用比较大的存储，因此主流的序列化还是protobuf。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-27 20:52:42',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 383,
                    'y' => 268,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 277,
                ),
            78 =>
                array (
                    'id' => 79,
                    'title' => '无双·历史密文-2',
                    'content' => '<p>本题和上题<a target="_blank"  href="http://www.qlcoder.com/task/75f0">真历史密文2</a>的唯一区别在于</p>
<pre><code>for(int j=0;j<3;j++)
{
temp^=(keys[temp&15]<<8);
temp=(temp<<7)|(temp>>17);
temp&= ((1<<24)-1);
}</code></pre>
<p>中的循环3次，改为循环10次。其余所有条件保持不变。</p>
<pre><code>for(int j=0;j<10;j++)
{
temp^=(keys[temp&15]<<8);
temp=(temp<<7)|(temp>>17);
temp&= ((1<<24)-1);
}</code></pre>
<p>下面这段是用该算法加密后的密文，key什么的我肯定不会告诉你的。这题的答案就在明文里。 密文的长度为144。</p>
<pre><code>43ed828cc922b4d8b84261669f7c716889bd389002b8aa789e39ede88ed2cd921cdfd7b13fd9f33d71336745d98ee8c01fb3b624399c8d4127da91a74bc107ae4aad371280885b7a</code></pre>',
                    'answer' => 'noanswer',
                    'material' => '此题为mac题',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-02 00:11:38',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 165,
                    'y' => 304,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 100000,
                ),
            79 =>
                array (
                    'id' => 80,
                    'title' => 'Modulo',
                    'content' => '<p><img src="http://121.201.63.168/uploads/145214873650932.jpeg" alt="" /></p>
<p>ticalc是在pc普及之前比较风靡的可编程计算器。</p>
<p>在国内也有对应的非常流行的设备，我们称之为 文曲星。
然而文曲星的主要功能如下:
<img src="http://121.201.63.168/uploads/145214892351378.png" alt="" style="width:100%"/></p>
<p>当然我们跟父母说得必然是查单词啦~~</p>
<p>在那个时代，有很多非常有意思的基于ticalc和文曲星的puzzle打发了无数的晚自习早自习…
其中公认的最最最有挑战的puzzle,莫过于modu10了。</p>
<p><img src="http://121.201.63.168/uploads/145214917249126.gif" alt="" /></p>
<p>举例:</p>
<p>每关会提供一个n行m列的二维地图，这里(n=3,m=3)
初始值</p>
<pre><code>010
011
010</code></pre>
<p>然后每关会提供a块piece。（这里等于3）</p>
<p>piece1 由3块组成,格式为:<code>X.,XX</code>,该格式代表的形状如下:</p>
<pre><code>X
XX</code></pre>
<p>piece2 由2块组成,格式为<code>XX</code>,该格式代表的形状如下:</p>
<pre><code>XX</code></pre>
<p>piece3 由3块组成,格式为<code>X,X,X</code>,该格式代表的形状如下:</p>
<pre><code>X
X
X</code></pre>
<p>再提供一个modu值，这里的modu=2。</p>
<p>然后你可以把这3块piece放在地图上任意一个位置,不能超出地图的边界。piece不可旋转,每个piece只能用1次也必须用1次。</p>
<p>当你放置一个piece之后，地图上被这个piece覆盖的格子的值会相应的加1。
如果格子中的值等于modu,又会被重置为0..</p>
<p>地图最初的状态</p>
<pre><code>010
011
010</code></pre>
<p>如果把piece1放在地图的1,1位置(第2行第2列)
piece放置的位置:</p>
<pre><code>000
0X0
0XX</code></pre>
<p>地图变成了:</p>
<pre><code>010
001
001</code></pre>
<p>接着把piece2放在地图的0,1位置(第1行第2列)
piece放置的位置:</p>
<pre><code>0XX
000
000</code></pre>
<p>map变成了</p>
<pre><code>001
001
001</code></pre>
<p>接着再把piece3放在地图的0,2位置(第一行第三列)
piece放置的位置:</p>
<pre><code>00x
00x
00x</code></pre>
<p>map变成了</p>
<pre><code>000
000
000</code></pre>
<p>当map中的每个元素都是0，该题通过。</p>
<p>因此对于以上这关,3个piece的正确的摆放位置是(1,1)(0,1)(0,2),最终编码为:<code>110102</code></p>
<p>对于例子中的这关,你将得到这样一个输入信息。</p>
<pre><code>{"map":["010","011","010"],"pieces":["X.,XX","XX","X,X,X"]}</code></pre>
<p>提交以下信息可以通过此关。</p>
<pre><code>110102</code></pre>
<p>本题共63关，第x关得x/2分。(第1关0.5分,第30关15分)</p>
<p>附上自动化提交页面的<a target="_blank" href="http://www.qlcoder.com/train/automodu">传送门</a></p>
<hr />',
                    'answer' => 'noanswer',
                    'material' => '此题应该是最简单的mac题了，mac什么手快有手慢无啊...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-06 20:41:57',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 603,
                    'y' => 62,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 189,
                ),
            80 =>
                array (
                    'id' => 81,
                    'title' => '数据挖掘-Warmup',
                    'content' => '<p>目前国内每家公司对外都声称自己是一家大数据公司，自己有多少多少用户的行为数据。
然并卵，没有专业的数据挖掘工程师发掘数据的潜力，转化成生产力，这些数据只是躺在硬盘里的死灰。</p>
<p>数据挖掘工程师对于公司的价值输出非常非常巨大。
拿阿里说…
天猫今年双十一成交额912亿，若有某coder能通过数据分析在此基础上提升1%的成交转化率。
那么将多成交9亿，阿里的利润大约在成交额的5%，那么公司将在双11当天多赚4500w！！！
如果你能做到，我觉得阿里花这4500w中的2000w招聘你，也不是没有可能 = =！</p>
<p>大数据挖掘商业价值的方法主要分为四种：</p>
<ul>
<li>客户群体细分，然后为每个群体量定制特别的服务；(个性化推荐，天猫淘宝的首焦的个性化轮播，百度联盟的精准广告营销)</li>
<li>模拟现实环境，发掘新的需求同时提高投资的回报率；（股票量化交易等）</li>
<li>加强部门联系，提高整条管理链条和产业链条的效率；</li>
<li>降低服务成本，发现隐藏线索进行产品和服务的创新；</li>
</ul>
<p>如果你对数据挖掘尚未入门，推荐3个知乎的回答。</p>
<ul>
<li><a target="_blank" href="http://www.zhihu.com/question/20757000">在数据分析、挖掘方面，有哪些好书值得推荐?</a></li>
<li><a target="_blank" href="http://www.zhihu.com/question/23273263/answer/24978305">大数据的核心价值是什么</a></li>
<li><a target="_blank" href="http://www.zhihu.com/question/29265587">如何快速成为数据分析师</a></li>
</ul>
<p>分类是数据挖掘工程师的一个基本技能。</p>
<p>在分类问题中比较简单的一种是二分类问题。</p>
<p>比较通用的分类器有:</p>
<ul>
<li><a  target="_blank" href="http://baike.baidu.com/link?url=J6Ah48SFKVZMFJ1I63eCWZAaosaTf8UARCRhpyPxcQZb4sJMEB8GYzCPXmcCTDqzZFKX1ritFNJGqPiiEug_ma">svm</a></li>
<li><a  target="_blank" href="http://baike.baidu.com/link?url=qiDT7TmW7isJMHYEtbazI5lDGTe_SF9fBc_NaGf9ICDZKPajzcKyra4QuvmaH9Ke8NzSZpzHUb5XU-Td3IA9x_">决策树</a></li>
<li><a  target="_blank" href="http://baike.baidu.com/link?url=1dDzwOHi7iJPuL-KeIcIMQgwdmvHCJIcLaJ-PTt8vX-DwgdlYkoFSEV4m72rD8uYDQVs1Xkz3mup2-PMwHBY-Fs8x7nwc56M4Q-fagpKy_BBAeN1kl5TlsWlqciMUoGX7PC5sxemtsYonERETe16Ja">knn</a></li>
<li><a  target="_blank" href="http://baike.baidu.com/view/3447609.htm">kmeans</a></li>
<li><a  target="_blank" href="http://baike.baidu.com/link?url=NG7jg7QzzO8gV-Va5-MsUIKXEWCzg4Uh4ky3rnN_bqorTNyfBQxUlJg7uCqORrMMmBLgco9gYzfeOcr9fgVTHK">朴素贝叶斯</a></li>
</ul>
<p>接下来介绍一个非常有名的数据集:
BarryBecker从『1994年美帝人口普查』中抽取的比较干净的上万条数据。</p>
<p>该数据集有33561行，每一行代表一个美国公民的样本，每行有13个特征，用逗号隔开。
最后1个特征为题目中需要预测的值，既年收入是否超过50k。</p>
<p>这13个特征依次是:</p>
<ul>
<li>
<p>年龄 : 一个整数。</p>
</li>
<li>
<p>工作类型: Private（个体）, Self-emp-not-inc（非有限责任公司自由职业）, Self-emp-inc（有限责任公司自由职业）, Federal-gov（联邦政府）, Local-gov（地方政府）, State-gov（州政府）, Without-pay（无收入）, Never-worked（从未工作）.</p>
</li>
<li>
<p>教育程度: Bachelors（学士）, Some-college（大学未毕业）, 11th（高二）, HS-grad（高中毕业）, Prof-school（职业学校）, Assoc-acdm（大学专科）, Assoc-voc（准职业学位）, 9th（初三）, 7th-8th（初中一、二年级）, 12th（高三）, Masters（硕士）, 1st-4th（小学1-4年级）, 10th（高一）, Doctorate（博士）, 5th-6th（小学5、6年级）, Preschool（幼儿园）.</p>
</li>
<li>
<p>婚姻状态: Married-civ-spouse（已婚平民配偶）, Divorced（离婚）, Never-married（未婚）, Separated（分居）, Widowed（丧偶）, Married-spouse-absent（已婚配偶异地）, Married-AF-spouse（已婚军属）</p>
</li>
<li>
<p>职业: Tech-support（技术支持）, Craft-repair（手工艺维修）, Other-service（其他职业）, Sales（销售）, Exec-managerial（执行主管）, Prof-specialty（专业技术）, Handlers-cleaners（劳工保洁）, Machine-op-inspct（机械操作）, Adm-clerical（管理文书）, Farming-fishing（农业捕捞）, Transport-moving（运输）, Priv-house-serv（家政服务）, Protective-serv（保安）, Armed-Forces（军人）</p>
</li>
<li>
<p>家庭角色: Wife（妻子）, Own-child（孩子）, Husband（丈夫）, Not-in-family（离家）, Other-relative（其他关系）, Unmarried（未婚）</p>
</li>
<li>
<p>种族: White（白人）, Asian-Pac-Islander（亚裔、太平洋岛裔）, Amer-Indian-Eskimo（美洲印第安裔、爱斯基摩裔）, Other（其他）, Black（非遗）</p>
</li>
<li>
<p>性别:   Female（女）, Male（男）</p>
</li>
<li>
<p>资本收益（股票，房产等）: 一个整数。</p>
</li>
<li>
<p>资本损失(房产税，股票等): 一个整数。</p>
</li>
<li>
<p>每周工作时长: 一个整数。</p>
</li>
<li>
<p>原国籍:United-States（美国）, Cambodia（柬埔寨）, England（英国）, Puerto-Rico（波多黎各）, Canada（加拿大）, Germany（德国）, Outlying-US(Guam-USVI-etc) （美国海外属地）, India（印度）, Japan（日本）, Greece（希腊）, South（南美）, China（中国）, Cuba（古巴）, Iran（伊朗）, Honduras（洪都拉斯）, Philippines（菲律宾）, Italy（意大利）, Poland（波兰）, Jamaica（牙买加）, Vietnam（越南）, Mexico（墨西哥）, Portugal（葡萄牙）, Ireland（爱尔兰）, France（法国）, Dominican-Republic（多米尼加共和国）, Laos（老挝）, Ecuador（厄瓜多尔）, Taiwan（台湾）, Haiti（海地）, Columbia（哥伦比亚）, Hungary（匈牙利）, Guatemala（危地马拉）, Nicaragua（尼加拉瓜）, Scotland（苏格兰）, Thailand（泰国）, Yugoslavia（南斯拉夫）, El-Salvador（萨尔瓦多）, Trinadad&Tobago（特立尼达和多巴哥）, Peru（秘鲁）, Hong（香港）, Holand-Netherlands（荷兰）</p>
</li>
<li>年收入: 0 or 1，0代表小于等于50k，1代表大于50k。</li>
</ul>
<hr />
<p>这个文件<a href="/download/adult.txt">adult.txt</a>里含有32561个样本，作为你的训练集。</p>
<p>接下去这个文件<a href="/download/adult_test.txt">adult.txt_test</a>含有1000个样本,
请预测该1000个样本的年收入是否大于50k。
0代表否，1代表是。你的答案是一个长度为1000的由01组成的字符串。
正确率在80%以上的答案通过该题。
当你通过该题后,你可以看到完整的测试数据和答案以方便你调优代码。
</p>',
                    'answer' => 'noanswer',
                    'material' => '各位接下来的题目我会向国内的公司索要真实的，最好是非脱敏的数据帮助大家更好的提升数据挖掘的技能。真实的数据真的是太重要了。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-08 17:29:30',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 370,
                    'y' => 430,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 2941,
                ),
            81 =>
                array (
                    'id' => 82,
                    'title' => 'floodfill-1',
                    'content' => '<p>抠图，是图像处理中最常做的操作之一，将图像中需要的部分从画面中精确地提取出来。
qlcoder中，展示mac奖励的图片，就是用美图秀秀从mac官网抠下来的啦。</p>
<p><img src="http://121.201.63.168/uploads/145284784756574.png" alt="" style="width:100%"/></p>
<p><img src="http://121.201.63.168/uploads/145284791955830.png" alt=""/></p>
<p>目前很多图片处理工具都有类似的抠图功能比如，美图秀秀，photoshop。</p>
<p>在抠图过程中，最基本的一步就是分离前景背景，其中会用到一个填充方法叫做<a target="_blank" href="https://en.wikipedia.org/wiki/Flood_fill">floodfill</a>。</p>
<p><img src="http://121.201.63.168/uploads/145284748141674.gif" alt=""/></p>
<p>floodfill的思想很简单，在这里不做过多的介绍，大家有兴趣可以看看：</p>
<ul>
<li><a  target="_blank" href="https://zh.wikipedia.org/wiki/Flood_fill">https://zh.wikipedia.org/wiki/Flood_fill</a></li>
</ul>
<p>接下来有一张图片，该图片中有一条很长很长的蚊香蛙的背部图案，这个图案是一个文件的二进制表达。
每一环是一个bit，白色为1，蓝色为0，蚊香的最中心开始是文件头。</p>
<p>当你用floodfill正确的解析了这个文件，你会看到本题的答案。
<img src="http://121.201.63.168/uploads/145284816889895.png" alt=""  style="width:100%"/></p>',
                    'answer' => 'noanswer',
                    'material' => 'floodfill 本身的思想很简单，但是对于图形图像这么复杂的事情来说，在实际工作中想要有非常好的效果也是很不容易的。目前美图秀秀的抠图功能已经基本可以虐掉photoshop了。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-15 17:08:46',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 750,
                    'y' => 340,
                    'contributor' => 8,
                    'study' => '',
                    'score' => 6666,
                ),
            82 =>
                array (
                    'id' => 83,
                    'title' => 'floodfill-2',
                    'content' => '<p>此题是上一题的加强版。
图片比较大,提供1个<a href="http://www.qlcoder.com/download/bigspiral.png">下载地址</a></p>',
                    'answer' => 'noanswer',
                    'material' => '想写出高性能的高鲁棒性的floodfill也不是那么容易的嘛',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-15 18:50:27',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 810,
                    'y' => 360,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 11111,
                ),
            83 =>
                array (
                    'id' => 84,
                    'title' => '隐写术-1',
                    'content' => '<p>隐写术</p>
<p>2012年 <a target="_blank" href="http://www.dianping.com/citylist">大众点评</a>和<a  target="_blank" href="http://baike.baidu.com/link?url=dx0EA3Ck3i5DsbAL1Kuhi8Rc4OEYBjVMn-jRE0F7m1fl2N_tl66TOy-cUu5FDfW_V5vVkzbC2bNReaxrvpFwf_">食神摇摇</a>是美食类点评的两家相互竞争的公司。</p>
<p>当时两家的同质化竞争达到了非常严峻的地步，食神摇摇开始大规模爬取大众点评的数据（主要是图片）。</p>
<p>具体的新闻可以看这里:
<a  target="_blank" href="http://www.techweb.com.cn/internet/2012-09-07/1234573.shtml">食神vs大众</a>。</p>
<p>当时大众点评并没有选择走中国的司法流程。（因为实在是太慢了，因为实在是太不专业了，因为实在很难有个实质性的结果。具体可参考快播的庭审）。</p>
<p>而是选择了向苹果公司提交相关抄袭证据，要求苹果公司下架食神的app。
其中至关重要的证据，就是<a  target="_blank" href="https://zh.wikipedia.org/wiki/%E9%9A%90%E5%86%99%E6%9C%AF">隐写术</a>，大众点评通过隐写术内嵌了公司的版权信息。
进而食神团队在爬虫爬取过程中没有发现，因此食神的app中的图片也大量的含有了大众点评的版权信息。进而被苹果公司下架2次。</p>
<p>隐写术，英文名:“Steganography”,相关科普知识可查阅<a  target="_blank" href="https://zh.wikipedia.org/wiki/%E9%9A%90%E5%86%99%E6%9C%AF">wiki</a>。</p>
<p>在这里我介绍1种最简单的隐写术:基于rgb分量的最低位的隐写术。</p>
<p>下面有一张lenna的图片:</p>
<p><img src="http://121.201.63.168/uploads/145303100168558.png" alt="" /></p>
<p>提取该图片的绿色分量</p>
<p><img src="http://121.201.63.168/uploads/145303108817315.png" alt="" /></p>
<p>取绿色分量的最低位，如果是1就设置图片为绿,是0设为黑。</p>
<p><img src="http://121.201.63.168/uploads/145303123317121.png" alt="" /></p>
<p>ok,你将看到隐藏的信息:"Steganography"。
大众点评正是利用了这些信息向苹果公司证明了图片的来源，最终保护了公司的利益。</p>
<p>这题的答案在该lenna图片的红色分量上。</p>',
                    'answer' => 'Trithemius',
                    'material' => '目前我国的法律体系非常难以保护互联网方面的创作创新，大众点评合理利用技术手段维权的案例非常有借鉴的意义。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-17 19:49:44',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 580,
                    'y' => 370,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 518,
                ),
            84 =>
                array (
                    'id' => 85,
                    'title' => '隐写术-2',
                    'content' => '<p><a target="_blank" href="https://www.tmall.com/">天猫</a>是一个目前中国最大的电商网站之一。
目前天猫上的主要图片均采用了同一种隐写术。
如图：<img src="http://121.201.63.168/uploads/145620227274859.jpg" alt=""  style="width:100%;"/>
本题的答案为天猫隐写术隐藏的内容信息。</p>
<p>本题为mac题,mac由天猫技术部赞助。</p>',
                    'answer' => 'noanswer321',
                    'material' => '做不出这题也没有关系啦,我大阿里财大气粗,只要加入阿里巴巴,即可获得顶配mac。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-17 19:59:03',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 630,
                    'y' => 390,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 100000,
                ),
            85 =>
                array (
                    'id' => 86,
                    'title' => '循环&递归-1',
                    'content' => '<p>循环和递归在编程中经常会用到。</p>
<p>有人认为:"所有递归都可以改写成循环,并且循环的效率会大于递归"。
可以参考知乎的某个帖子:<a target="_blank" href="https://www.zhihu.com/question/20418254">所有递归都可以改写成循环吗？</a>。</p>
<p>奥利奥却不这么认为，奥利奥认为递归的表达能力要比循环高很多呢。</p>
<p>下面有一个伪代码写的递归函数。奥利奥认为它很难被改写成循环。这是一个递归无法被改写成循环的比较好的例子。</p>
<pre><code>function f(m,n)
{
if(m==0)return n+1;
if(n==0)return f(m-1,1);
return f(m-1,f(m,n-1));
}</code></pre>
<p>这题的答案是<code>f(7,7)</code>的16进制表达的最后8位。(答案是一个长度为8的16进制数,请用大写)</p>',
                    'answer' => 'noanswer',
                    'material' => '这个函数很有名,它的反函数和并查集还有点关系呢',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-22 18:38:31',
                    'updated_at' => '2016-04-25 17:26:16',
                    'author' => '82638883@163.com',
                    'x' => 490,
                    'y' => 80,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 2127,
                ),
            86 =>
                array (
                    'id' => 87,
                    'title' => '循环&递归-2',
                    'content' => '<p>这题的答案是<code>f(7,7)</code>的值的最后8位(7进制,答案是一个长度为8的7进制数)。</p>',
                    'answer' => 'noanswer',
                    'material' => '和上题唯一的区别就是把16进制改成7进制...只不过在上一题的基础上增加了进制转换...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-22 18:49:45',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 440,
                    'y' => 65,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 7142,
                ),
            87 =>
                array (
                    'id' => 88,
                    'title' => '贝塞尔曲线-1',
                    'content' => '<p><img src="http://www.qlcoder.com/uploads/145405468641911.png" alt="" style="width:100%"/></p>
<p>贝塞尔曲线的数学基础是早在 1912 年就广为人知的伯恩斯坦多项式。但直到 1959 年，当时就职于雪铁龙的法国数学家 Paul de Casteljau 才开始对它进行图形化应用的尝试，并提出了一种数值稳定的 de Casteljau 算法。然而贝塞尔曲线的得名，却是由于 1962 年另一位就职于雷诺的法国工程师 Pierre Bézier 的广泛宣传。他使用这种只需要很少的控制点就能够生成复杂平滑曲线的方法，来辅助汽车车体的工业设计。</p>
<p>正是因为控制简便却具有极强的描述能力，贝塞尔曲线在工业设计领域迅速得到了广泛的应用。不仅如此，在计算机图形学领域，尤其是矢量图形学，贝塞尔曲线也占有重要的地位。今天我们最常见的一些矢量绘图软件，如 Flash、Illustrator、CorelDraw 等，无一例外都提供了绘制贝塞尔曲线的功能。甚至像 Photoshop 这样的位图编辑软件，也把贝塞尔曲线作为仅有的矢量绘制工具（钢笔工具）包含其中。</p>
<p>贝塞尔曲线可以通过几个点来比较精确的描述一段曲线。</p>
<p>下面这个例子通过3个点,描述了1段抛物线:</p>
<p><img src="http://www.qlcoder.com/uploads/145405484652047.gif" alt="" /></p>
<p>这是一个更复杂的例子:</p>
<p><img src="http://www.qlcoder.com/uploads/145405495941444.gif" alt="" /></p>
<p>再来个更更复杂的例子:</p>
<p><img src="http://121.201.63.168/uploads/145405508349723.gif" alt="" /></p>
<p>因此,贝塞尔曲线只需要线性的增加控制点的个数，就能表达无限复杂的曲线了。</p>
<p>当把贝塞尔曲线推广到三维空间,以及更进一步的非均匀有理 B 样条（NURBS），它就拥有了更大的运用场景。早已成为当今计算机辅助设计（CAD）的行业标准，不论是我们平常用到的各种产品，还是在电影院看到的精彩大片，都少不了它们的功劳。
<img src="http://www.qlcoder.com/uploads/145405682231451.png" alt="" /></p>
<p>这里有个网页:<a target="_blank" href="http://www.qlcoder.com/uploads/bezier.html">传送门</a>。
里面有一个500*500的canvas。</p>
<p>由一条 由2个线段表达的三次贝塞尔曲线分割成2块闭合区域。线段1:[(0,100)-(250,0)],线段2:[(0,300)-(500,500)]</p>
<p>这题的答案是上半部分闭合区域的面积大小。精确到小数点后3位,四舍五入。</p>',
                    'answer' => 'noanswer',
                    'material' => '求出题者心里的阴影面积',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-29 16:40:59',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 370,
                    'y' => 470,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 5000,
                ),
            88 =>
                array (
                    'id' => 89,
                    'title' => '贝塞尔曲线-2',
                    'content' => '<p>这里有个网页:<a href="http://www.qlcoder.com/uploads/bezier.html">传送门</a>。
里面有一个500*500的canvas。</p>
<p>由一条 由2个线段表达的三次贝塞尔曲线分割成2块闭合区域。</p>
<p>这题的答案是该曲线的长度,四舍五入精确到小数点后3位。</p>',
                    'answer' => 'noanswer',
                    'material' => '此题跟上题一样简单。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-29 18:09:12',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 355,
                    'y' => 530,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 5555,
                ),
            89 =>
                array (
                    'id' => 90,
                    'title' => '数据挖掘-2',
                    'content' => '<p><img src="http://www.qlcoder.com/uploads/145414966836906.png" alt="" /></p>
<p><a target="_blank" href="http://taoshijie.com/">淘世界</a>，世界买手正在淘，8000买手帮你找到海外同款，零时差享受海外商场限时折扣，让您身临其境享受购物乐趣。</p>
<p>淘世界，成立于2014年8月，致力于为更多中国消费者提供一个安心放心的海外购物平台，享受购物原本的乐趣，其业务范围覆盖北美、澳洲、欧洲、日韩等58个热门国家与地区的企业。</p>
<hr />
<p>感谢淘世界提供的真实的数据。虽然是脱敏过的= =!。</p>
<p>淘世界的买手以及运营将全世界的好东西根据价格带,款式,时尚度,品牌知名度,风格,色系等等等等共10个feature,来判断该不该将某商品推送给用户。</p>
<p>下面有一个<a target="_blank" href="http://www.qlcoder.com/download/task7629.zip">zip格式的压缩文件夹</a>。内含2个文件。
train.txt共570000行,每行由1个商品id（int）,10个脱敏后的feature(float),以及1个result(0 or 1)组成。 1代表该推荐,0代表不该推荐。</p>
<p>check.txt 共30000行。每行由1个商品id（int）,10个脱敏后的feature(float)组成。
本题的答案和上题类似,由30000个01组成。准确率超过88%的用户通过此题。
由于本题数据量巨大，并且均为真实数据，不存在过拟合的问题，因此会有排行榜，以最优化问题的形式结算分数。</p>',
                    'answer' => 'noanswer',
                    'material' => '想在北京工作的同学可以简历我一波...公司已完成B轮融资在和小红书刚正面。我的邮箱是:xiaoxiao@aimeizhuyi.com。入职通过试用期的小伙伴直接发顶配的mac和6s。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-30 19:31:58',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 295,
                    'y' => 495,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 4347,
                ),
            90 =>
                array (
                    'id' => 91,
                    'title' => '语音识别-1',
                    'content' => '<p><img src="http://121.201.63.168/uploads/145424670019774.jpg" alt="" style="width:100%"/>
音频是个专业术语，人类能够听到的所有声音都称之为音频，它可能包括噪音等。声音被录制下来以后，无论是说话声、歌声、乐器都可以通过数字音乐软件处理，或是把它制作成CD，这时候所有的声音没有改变，因为CD本来就是音频文件的一种类型。而音频只是储存在计算机里的声音。如果有计算机再加上相应的音频卡——就是我们经常说的声卡，我们可以把所有的声音录制下来，声音的声学特性如音的高低等都可以用计算机硬盘文件的方式储存下来。反过来，我们也可以把储存下来的音频文件用一定的音频程序播放，还原以前录下的声音。</p>
<p>声音的本质是物体不同频率的震动,以波的形式在介质中传播。</p>
<p>根据震动频率的不同,分了很多声高。
比如中央C(钢琴中间的do)的频率约为262Hz，每高一个八度，频率翻倍。一般用cdefgab来表示do re mi fa sol la si。</p>
<p><a target="_blank" href="http://121.201.63.168/uploads/145425353234642.mp3">这个mp3文件</a>,由钢琴依次弹奏了12个音高。当你能清晰的分辨它所用到的音高,你就能知道这题的答案了。
答案是由12个小写字母组成(cdefgab中的一个)。
</p>',
                    'answer' => 'feedabadbeef',
                    'material' => '哪怕是音盲，也是可以通过专业的工具和频谱分析胜任音频处理方面的工程师的！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-01-31 21:34:14',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 750,
                    'y' => 170,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 5000,
                ),
            91 =>
                array (
                    'id' => 92,
                    'title' => 'ABTest',
                    'content' => '<p>在一个网站或者app的迭代过程中,经常会出现以下问题:</p>
<ul>
<li>按钮到底是黄色好还是红色好?(什么颜色的按钮点击率更高)?</li>
<li>按钮上的文案是『去看看』还是『我要购买』更能吸引用户?</li>
<li>angelababy和杨幂哪位出现在首焦广告上能达到最高的转化?</li>
</ul>
<p>种种问题,都可以用ABTest解决！</p>
<p>举个例子:</p>
<p><img src="http://121.201.63.168/uploads/145432551838636.png" alt="" /></p>
<p>贝贝网目前每天有100w用户访问。
让50%的用户看到A方案的页面。
让剩下的50%的用户看到B方案的页面。</p>
<p>然后分别统计两边的流量和成交额，最终通过对比统计数据，就能得出哪边的方案更优秀啦！</p>
<p>一般而言，对于pc端，我们会在每个用户的cookie中种入一个<a target="_blank" href="http://baike.baidu.com/link?url=sfc-fDJmlSvqhmcoaS0BqG-xPuwjq_thUDcIVo7YPIbeeMPTC8JrTPLVolbwDraC8twI87b0qbMJNf4UFaFjZK">uuid</a>。
由于uuid是纯随机的16进制，
最简单的方式，就可以根据uuid的第一位，将所有用户分为16份。如果总共有160w用户，那么每份流量下就有10w用户。这样，就可以同时测试16种方案，最终统计这16份流量下的核心数据，便可以从中选出最优的方案了。</p>
<p>对于移动端，情况也是类似，不过移动端我们往往不需要为每个用户生成一个uuid，直接根据用户的手机设备号分组即可。</p>
<p>对于这道题考什么，qlcoder官方审题小组非常之纠结，于是决定根据用户的cookie中的uuid的第1位分成16个问题...
好啦，这里有一个<a  target="_blank" href="http://www.qlcoder.com/train/abtest">页面</a>,您的问题就在里面。</p>',
                    'answer' => '5de6ed166353b8edf62b185889447f9b',
                    'material' => '一个健全的实时的abtest体系能在1天内解决产品经理之间的碰撞,能快速的衡量运营和推广的工作效果。也能更好提高算法优化团队的迭代速度。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-01 20:27:10',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 304,
                    'y' => 232,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 763,
                ),
            92 =>
                array (
                    'id' => 93,
                    'title' => 'Reconnaissance',
                    'content' => '<p>最近<a target="_blank" href="http://baike.baidu.com/link?url=i9ab2doG7U1ZYxI_2OcoJ3Xt-htyUFkkbF3dgXPp7cz6iHKXxkk3W_hWzFdRu3D6ckYVc9OAdAcMMb8VXAUlBWpEDh5zpnOQnarScfkuDDW">e租宝</a>爆出非法集资500多亿,待收总额703亿…受害的投资人总数90.95万.</p>
<p><img src="http://121.201.63.168/uploads/145441161159153.png" alt="" /></p>
<p>笔者身边也有几个可怜的被e租宝坑害的coder。然而笔者却没有上当。</p>
<p>事情是这样的，笔者去年下半年有点闲钱，准备买车。苦于杭州一直摇号摇不到。
就准备把钱买理财产品啦~
网上的各种p2p平台上的投资回报率比银行高不知道哪里去了。
比如e租宝，号称年化收益14.6%…要知道余额宝只要3%啊…!</p>
<p>于是笔者开始人肉了e租宝是否靠谱。
大约总共花了1个小时...
只需要通过简单的搜索…
就能知道e租宝所属钰诚集团。</p>
<p>然后可以查到所有在e租宝上出租和承租的公司的信息。
具体详见<a  target="_blank" href="https://www.zhihu.com/question/29921698">钰诚集团怎么样</a>。</p>
<p>跟知乎上的搜索过程非常类似。</p>
<p><font color="red">只需要1个小时的时间，就可以判断出e租宝是个不靠谱的公司了。1个小时，避免了几十万的损失..
笔者人肉了上面的6家招标的公司，基本都是皮包公司，于是决定继续把钱放余额宝。。。</font></p>
<p>ok，介绍到这里。</p>
<hr />
<p>Reconnaissance，就是通过某实体在网上暴露出来的各种信息，来分析和判断该实体在现实世界中的情况。
好好的利用搜索引擎，你能得到非常多有用的信息避免错误的决策。</p>
<p>好了，我有个漂亮的女同事，自从在qlcoder上看到了<a  target="_blank" href="http://www.qlcoder.com/q/764d#a881">Sayalic写的学习资料</a>就喜欢得不行。想找你帮忙分析分析，Sayalic是不是一个值得托付终身的人。这题的答案是Sayalic的个人资料,包括姓名、手机号、qq号、以及是否值得托付终身("yes" or "no"),以json的形式提交。格式举例:{"name":"xxxx","tel":"xxxx","qq":"xxxx","marry him":"xxxx"}</p>',
                    'answer' => 'noanswer',
                    'material' => '老司机Sayalic的成长历程清晰可见...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-02 19:34:07',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 550,
                    'y' => 520,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 2272,
                ),
            93 =>
                array (
                    'id' => 94,
                    'title' => 'gdb',
                    'content' => '<p>《程序员的自我修养》说：真正了不起的程序员对自己程序的每一个字节都了如指掌。对于这句话，我深以为然。对于一个程序员来说，调试程序那是永远逃不掉的。当你辛辛苦苦写完了一大坨代码，编译，运行，一气呵成，然后开始悠然的等待，等待结果的到来…之后你看到的是日志乱了，IO乱了，一切都乱了，程序跑飞了…你一遍一遍的检查代码，走遍每一个分支，看过每一个变量，怎么看都没有问题。更可气的是，经过多次的运行测试，你发现这程序有时候跑对了，但有时候却跑飞了。只剩下了最后一招，调试，扒开程序的层层外衣，找到出错的那行代码，然后干掉它。
很多时候,在测试环境下100%正确的程序扔到线上就莫名其妙的发生各种错误,并且你在测试环境里模拟不出来，怎么办，最后的救命稻草，就是线上现场debug。
说到调试程序，自然要提到大名鼎鼎的GDB了，在GDB的面前，你的程序的内存空间就赤裸裸的暴露在了你的面前，变量、堆栈、线程、执行指定的函数都清晰可见。
下面就是一个简单的多线程程序，答案就在某一个线程的堆栈里面，当你用gdb调试线程，你就可以看到答案啦~</p>
<ul>
<li><a href="http://www.qlcoder.com/download/debug_win7_x86.exe">windows版本</a></li>
<li><a href="http://www.qlcoder.com/download/debug_linux_x86.bin">linux32版本</a></li>
<li><a href="http://www.qlcoder.com/download/debug_linux_x86_x64.bin">linux64版本</a></li>
<li><a href="http://www.qlcoder.com/download/debug_mac.bin">mac版本</a></li>
</ul>',
                    'answer' => 'noanswer',
                    'material' => '作者已失联,请作者看到此题联系qlcoder领取键盘!',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-03 20:06:56',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 740,
                    'y' => 270,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 1515,
                ),
            94 =>
                array (
                    'id' => 95,
                    'title' => '春节福利-遗传算法',
                    'content' => '<p>春节福利-遗传算法</p>
<p>遗传算法（Genetic Algorithm）是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型，是一种通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群（population）开始的，而一个种群则由经过基因（gene）编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体，即多个基因的集合，其内部表现（即基因型）是某种基因组合，它决定了个体的形状的外部表现，如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此，在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂，我们往往进行简化，如二进制编码，初代种群产生之后，按照适者生存和优胜劣汰的原理，逐代（generation）演化产生出越来越好的近似解，在每一代，根据问题域中个体的适应度（fitness）大小选择（selection）个体，并借助于自然遗传学的遗传算子（genetic operators）进行组合交叉（crossover）和变异（mutation），产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境，末代种群中的最优个体经过解码（decoding），可以作为问题近似最优解。</p>
<p>对于很多最优化问题，由于解空间无限大，所以靠枚举所有局面是基本不可能的。
因此我们需要遗传算法或者模拟退火算法等能在有限时间内找到近似最优解的方案。</p>
<p>以下这个问题，就非常适合用类似的方法去得到近似最优解。</p>
<p>通过随机一个局面作为初始基因，然后通过遗传进行优胜劣汰。
变异的存在也可以很好的避免陷入局部最优解。</p>
<hr />
<p>有n个矩形小纸片(n<=100),它们的长宽各不相同,需要你放在一个长宽均不超过100的矩形桌面上。</p>
<p>放置的规则如下:</p>
<ol>
<li>每个小纸片最多只能被放置1次,也可以选择不放。</li>
<li>你可以将小纸片放置在桌面上的任意位置,但不能超出桌面的边界。</li>
<li>小纸片之间不能相互叠压,无任何面积重叠。</li>
<li>每个小纸片你都可以缩小或者放大（长宽比不能变）,长宽最大可以放大到2倍，最小可以缩小到原来的十分之一。（举例:1个15*13的小纸片,可以放大到30*26,也可以缩小至1.5*1.3）。</li>
<li>
<p>每张小纸片只有两种放置方法，直接放置或者旋转90°放置。直接放置的小纸片我们称之为A类小纸片,旋转90°之后放置的小纸片我们称之为B类小纸片。</p>
</li>
<li>当两个不同种类的小纸片相邻,如果他们相邻的线段的长度是x,你的得分将增加x。</li>
<li>当两个相同种类的小纸片相邻,如果他们相邻的线段的长度是x,你的得分将减少x。</li>
</ol>
<p>请你给出一个放置方案，使你的得分最高。</p>
<p>为了便于简化问题以及更方便的评测:</p>
<ul>
<li>
<p>你放置矩形的x,y坐标最多保留1位小数。这意味着乘以10之后,它们的值都是一个整数。举例:</p>
<ul>
<li>你可以把1个纸片的左上角放在(1.3,1.3)位置。</li>
<li>你不可以把1个纸片的左上角放在(1.35,1.35)位置。</li>
</ul>
</li>
<li>小纸片被缩放后,它们的长和宽最多保留1位小数。这意味着乘以10之后,它们的值都是一个整数。举例:
<ul>
<li>你可以把1个15*13的纸片缩放为3.0*2.6。</li>
<li>你不可以把1个15*13的纸片缩放为15.75*13.65，虽然长宽比是一样的。</li>
<li>你不可以把3*7的纸片缩小7倍变成0.4(0.4286四舍五入)*1,因为四舍五入是不被允许的，这样会使长宽比不一致。</li>
</ul></li>
</ul>
<hr />
<p>这里有个<a target="_blank" href="/train/gatool">传送门</a>，里面包括如下内容:</p>
<ul>
<li>
<p>工具箱内陈列着所有的小纸片,你可以把这些小纸片放置在右侧的桌面上。</p>
<ul>
<li>按+号是放大小纸片。</li>
<li>按-号是缩小小纸片。</li>
<li>按空格是选择A类或者B类小纸片。</li>
</ul>
</li>
<li>
<p>红色的input按钮可以选择某个具体input文件。</p>
<ul>
<li>input文件的第一行是2个整数,分别代表桌面的长(x轴)和高(y轴)。</li>
<li>input文件的第二行是一个整数n,代表小纸片的个数。</li>
<li>input文件接下来有n行，每行2个整数，代表每个小纸片的长(x轴)和高（y轴）。</li>
</ul>
</li>
<li>
<p>对于每个input文件，最终你需要提供1个output文件。</p>
<ul>
<li>该文件有n行，每行代表一个小纸片。</li>
<li>每行有4个浮点数，分别代表每个小纸片左下角坐标(x1,y1)和右上角坐标(x2,y2)。</li>
<li>如果你不准备把某个小纸片放置在桌面上,那么该行为"-1 -1 -1 -1"。    </li>
</ul>
</li>
<li>该题的得分为这10个input文件你所得到的总分。</li>
</ul>
<p>PS:非常感谢@ikarienator提供的gatool。</p>',
                    'answer' => 'noanswer',
                    'material' => '大家新春快乐！',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-08-23 12:31:24',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 740,
                    'y' => 70,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 100000,
                ),
            95 =>
                array (
                    'id' => 96,
                    'title' => '拟合-1',
                    'content' => '<p>在数据分析中，经常会根据现有的数据集来预测未来的走势。比如对股市过去的交易数据进行分析来预测未来股市的走向，对过去天气各种指标的分析来预测未来几天的天气</p>
<p>其中比较基础的一种根据现有数据集（点集）描绘未来走势曲线的方式:拟合。</p>
<p>线性拟合是拟合中运用比较广泛的。</p>
<p>matlab和excel都有关于线性拟合的工具包。</p>
<p><img src="http://121.201.63.168/uploads/145613768581731.jpg" alt="" /></p>
<p>这里有一个1000行的<a href="http://121.201.63.168/uploads/145613865992313.txt">文本文件</a>，文件的每一行有2个浮点数，代表一个点的坐标(x,y)。（所有点都在第一象限）</p>
<p>请找出一条直线 <code>Y=a*X+b</code>，使文件中所有点和该直线的距离的和最短。</p>
<p>你提交的答案包含2个浮点数a,b,中间用<code>-</code>分隔。（举例:<code>3.14-5.18</code>）</p>
<p>通过条件：提交答案所得的各点到直线的最短距离的和 <= 1300时，即为通过。</p>',
                    'answer' => '',
                    'material' => '回归、插值、逼近、拟合...大家会不会傻傻分不清楚',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-22 19:00:12',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 318,
                    'y' => 299,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 1470,
                ),
            96 =>
                array (
                    'id' => 97,
                    'title' => '拟合-2',
                    'content' => '<p>用多项式来拟合点集在数据分析中经常用到。</p>
<p><a target="_blank" href="http://baike.baidu.com/link?url=qxk-Uvugc1ufV6UvfgbSW_hL8hrpjnU97UkWzf_WWKCRQJ_iAbDadWPrF8ShlsGb7m1FTiQHqrxqwe1e1WlVSa">最小二乘法</a>是常用的求该多项式曲线的方法。</p>
<p>这里有一个10000行的<a href="/download/145622513871043.txt">文本文件</a>，文件的每一行有2个浮点数，代表一个点的坐标(x,y)。（所有点都在第一象限）</p>
<p>请找出一个多项式曲线 <code>Y=a*X^5+b*X^4+c*X^3+d*X^2+e*X+f</code>，使文件中所有点和该曲线的垂直距离的平方的和最短。</p>
<p>一个点(x,y)到该曲线的垂直距离为<code>abs(a*x^5+b*x^4+c*x^3+d*x^2+e*x+f-y)</code>。</p>
<p>你提交的答案包含6个浮点数a,b,c,d,e,f
。中间用<code>:</code>分隔。（举例:<code>-3.14:5.18:3.15:-3.16:-3.17:5.31</code>）</p>
<p>通过条件：提交答案所得的各点到曲线的垂直距离的平方和 <=8195000 时，即为通过。</p>',
                    'answer' => 'noanswer',
                    'material' => '最小二乘法是机器学习的基础的基础的基础。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-23 17:46:02',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 246,
                    'y' => 287,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 1886,
                ),
            97 =>
                array (
                    'id' => 98,
                    'title' => '搜索提示-1',
                    'content' => '<p>目前各大网站都有搜索框，搜索框中一个比较重要的功能是搜索提示。
我国社会主义特色的搜索提示必须是支持拼音的。</p>
<p><img src="http://www.qlcoder.com/uploads/145630624442592.jpg" alt="" style="width:100%"/></p>
<p>一般网站的做法是将每天的热搜语句生成拼音索引。
比如<code>爸爸去哪儿</code>转化成<code>babaqunaer</code>（拼音全写）和<code>bbqne</code>（拼音首字母简写）</p>
<p>当用户搜索<code>baba…</code>就能定位到热门搜索词<code>爸爸去哪儿</code>的拼音索引<code>babaqunaer</code>，然后就能生成友好的搜索提示啦。</p>
<p>这里有一个666行的<a href="/download/145630854135681.txt">文本文件</a>。文件的每行是一个用户经常搜索的词。
请生成这666个词的拼音全写索引。</p>
<p>比如第一行的<code>爸爸去哪儿</code>，拼音全写为<code>babaqunaer</code>。
第二行的<code>狮子王</code>，拼音全写为<code>shiziwang</code>。</p>
<p>将这666个拼音全写按顺序拼接成一个很长的字符串:<code>babaqunaer-shiziwang…</code>，这题的答案为该字符串,中间用`-`分隔,由于多音字干扰,666个中对645个以上设置为通过。</p>
<p>PS: ü用v代替。吕:lv</p>',
                    'answer' => '',
                    'material' => '技术部不仅要持续支持公司的新业务，『还』要『还』之前欠下的技术债。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-24 17:32:41',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 190,
                    'y' => 355,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 2564,
                ),
            98 =>
                array (
                    'id' => 99,
                    'title' => '分布式-1',
                    'content' => '<p>大型网站的负荷往往超过单机的瓶颈，需要多台机器分担压力。</p>
<p>广告一波:</p>
<p>"今日头条"是一款基于数据挖掘的推荐引擎产品，是国内移动互联网领域成长最快的产品服务之一。“今日头条”第一个版本于2012年8月上线，截至2016年2月，“今日头条”已经在为超过4亿的忠诚用户服务，每天有超过4000万的用户在头条上找到让他们了解世界、启发思考、开怀一笑的信息，并活跃地参与互动。</p>
<p>“今日头条”的团队是一支拥有丰富创业及成熟公司经验的靠谱团队，聚集了来自一流学校和一流公司的顶尖人才，在推荐引擎、机器学习等技术领域拥有与世界级公司接轨的能力。公司正处于高速发展期，2014年6月，今日头条获得C轮1亿美元的融资。</p>
<p>具体详见: <a target="_blank" href="http://toutiao.com/about/">http://toutiao.com/about/</a></p>
<hr />
<p>每晚下班高峰同时有3000w用户在使用今日头条的app。</p>
<p>平均每秒100w用户的请求。</p>
<p>由于单机只能承受3000用户/秒的访问，今日头条至少需要300台机器才能让每个用户都能看到他们想要获取的资讯。</p>
<p>今天的问题:</p>
<p><code>如何把每秒100w用户的请求均分到300台机器呢？</code></p>
<p>ok，我们采用经典的lvs负载均衡架构:</p>
<p><img src="http://www.qlcoder.com/uploads/145641011469014.jpg" alt="" style="width:100%"/></p>
<ol>
<li>用户访问server0索要服务器列表。</li>
<li>由server0上维护着300台服务器的ip。</li>
<li>当一个用户请求过来，server0从300台机器的列表中随机一台机器，由该机器去执行该用户的阅读请求，根据高大上的个性化推荐算法算出用户想看的文章列表。再把运算完的列表结果返回给server0。</li>
<li>server0返回给用户。</li>
</ol>
<p><br>
server0不消耗cpu，只作为任务分发和结果页面取回。300台机器满负荷不偷懒的运算工作。</p>
<p>食年:『ok！完美解决问题！当当当！！lvs叼炸天！！lvs是阿里巴巴的章文嵩教授写的，仰慕一波。』</p>
<p>小白鼠:『但是，你以为图片上的server0是兄贵机么，假设每个用户拿到的html页面是500KB，100w个用户在同一秒请求的话，总的html页面的大小是500kb*100w=500000000KB=500GB！！！</p>
<p>server0:『老子确实不怎么用cpu，但是带宽吃不消啊。。现在虽然流行千兆网卡。。。但是。。500GB/s你在逗我么？！』</p>
<p>小白鼠:『你以为server0是兄贵机器么！能同时传递100w用户的数据，带宽早被占满啦！！！』</p>
<p>ok，我们换1个架构:</p>
<p><img src="http://121.201.63.168/uploads/145641014088178.jpg" alt=""  style="width:100%"/></p>
<p>把ip列表写死在用户的app里，当用户打开今日头条的app，随机这300个ip中的1个，然后不就ok了，连lvs都节约了。。。</p>
<p><img src="http://121.201.63.168/uploads/145641053768614.gif" alt="" /></p>
<p>但是，运维组的那帮实在太可恶了。</p>
<p>今日头条路人工程师A：『喂喂，你赶紧更新个ios版本，我们加了2台机器，300台变成302台啦。。』</p>
<p>今日头条路人工程师B：『那个。。有台机器坏掉了，你把那个ip下掉，赶紧发给苹果公司审核』</p>
<p>今日头条路人工程师C：『有台机器我更新了下cpu，他现在的负载1台顶2台，你改下随机的逻辑，让它被用户选中的概率从1/300变成1/150！』</p>
<p>要死要死。。ip列表写死在用户的app里简直是作死。</p>
<p>于是我们这么闹:</p>
<p><img src="http://121.201.63.168/uploads/145641016015761.jpg" alt=""  style="width:100%"/></p>
<p>独立出1台机器（server0），作为配置中心（config server），存储着ip列表和机器的权重等内容，当用户打开今日头条的app：</p>
<ol>
<li>用户向server0要1个可用的服务器ip。</li>
<li>server0从配置列表中返回某个可用的服务器的ip。</li>
<li>用户直接把请求发送到该服务器。</li>
<li>该服务器经过运算直接把推荐列表返回给用户。</li>
</ol>
<p>运维工程师维护机器:</p>
<ol>
<li>当上线机器的时候向config server发起请求告知上线新机器。</li>
<li>config server不断向每台服务器发起心跳请求，当服务器没响应自动从列表中删除并报警。</li>
</ol>
<p>ok，你看到了，configserver还是需要很多功能的。</p>
<ul>
<li>当新加了机器，能告知并投入生产坏境响应用户的请求。</li>
<li>当机器故障能检测并及时下线。</li>
<li>更改机器的配置信息等等。</li>
</ul>
<p>小白鼠：『咦，乍看之下感觉是个分布式系统都需要用到啊。。』</p>
<p>食年：『对对对没错没错configserver是每个分布式系统所必须的。』</p>
<p>小白鼠：『等等。。。但是configserver挂了岂不都挂了。。如果server0一不小心cpu烧了，今日头条岂不就挂了？』</p>
<p>食年：『对啊对啊，所以configserver本身也是分布式的集群。』</p>
<p>好好好，来看看现在的架构，架构4:</p>
<p><img src="http://www.qlcoder.com/uploads/145641080130757.jpg" alt=""  style="width:100%"/></p>
<p>食年：『你看，config-server也被集群化了。。。』</p>
<p>小白鼠：『但是一旦被集群化了，就会有很多问题啊，master-slave数据怎么同步呢？config-server中某台机器挂掉了怎么办呢？』</p>
<p>食年：『对嘛对嘛，所以写个config-server也是很麻烦的嘛！！！你以为配置中心这么好写的啊』</p>
<p>小白鼠：『好好好，让我看看hadoop的配置中心怎么写的？』</p>
<p>食年：『hadoop啊，它们用的是zookeeper』</p>
<p>小白鼠：『好好好，我再看看spark的配置中心怎么写的？』</p>
<p>食年：『spark啊，它们项目组太烂了。。也直接用了zookeeper』</p>
<p>小白鼠：『那solr项目组和kafka项目组，还有hbase项目组呢，不会也用zookeeper吧』</p>
<p>食年：『是啊是啊都是一帮不愿意自己造轮子的，用的都是zookeeper！』</p>
<p>小白鼠：『妈蛋，那我们还用考虑么，也用zookeeper啊』</p>
<p>今日头条工程师：『对啊对啊，今日头条用的就是zookeeper啊！』</p>
<hr />
<p>话锋一转。。。ZooKeeper是一个分布式的，开放源码的分布式应用程序协调服务，是Google的Chubby一个开源的实现，是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件，提供的功能包括：配置维护、域名服务、分布式同步、组服务等。</p>
<p>zookeeper是目前全世界最最最流行的分布式协调组件，没有之一。</p>
<p>目前千里码数千万（虚词，其实是3台）服务器的协同工作，用的也是zookeeper。</p>
<p>okok，这里是<a href="https://zookeeper.apache.org/">zookeeper的官网</a>，里面有zookeeper的教程，目前qlcoder在服务器121.201.8.217上部署了zookeeper，版本号：3.4.8，对外的端口是2181。当你用zookeeper的client连上之后，查看/qlcoder/zookeeper节点，就能看到本题的答案了。</p>',
                    'answer' => 'toutiao.com',
                    'material' => '我们公司最近刚搬到高大上的中航广场，有三餐，健身，住房补贴等等实用福利；我们正处于高速发展期，缺大量有实力的有志之士加入，有了你的加入，下一个BAT或许就是我们。还在等什么呢？希望内推的各位，请把你们的邮件发送给 mailto:lvweibin@bytedance.com 请在标题注明内推+姓名并附上您的简历。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-25 21:28:12',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 772,
                    'y' => 208,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 1470,
                ),
            99 =>
                array (
                    'id' => 100,
                    'title' => '搜索提示-2',
                    'content' => '<p>为了支持用户更精准的查询，在天猫的搜索框下面，往往会有很多的筛选条件。
我们称之为条件查询。</p>
<img src="http://www.qlcoder.com/uploads/145673990067976.png" alt="" style="width:100%"/>
<p>当用户在前端选择好各种条件之后，我们将用户的选择转化成标准的布尔查询。</p>
<p>这个过程称之为: query-rewrite。</p>
<h3>query rewrite</h3>
<p>query-rewrite模块主要负责对用户的查询做预处理。</p>
<p>举个例子，当一个资深用户的搜索语句为 "我想要一件黑色的羽<font color="red">容</font>服"。注意这里的[羽容服]为错别字。</p>
<ol>
<li>先通过分词模块筛选掉无意义的量词，查询语句简化成<code>黑色 羽容服</code>。</li>
<li>再通过别字纠正模块更正为羽绒服，查询语句更正为<code>黑色 羽绒服</code>。</li>
<li>由于用户没有主动选择价格区间，根据用户之前的购买记录和购买力，发现该用户为土豪用户。而羽绒服的价格区间是300rmb-5000rmb，土豪用户就看到稍微偏贵的3000rmb-5000rmb。</li>
<li>根据用户的购买记录，该用户的尺寸是大码，所以尺码是6。（XXL）</li>
<li>根据用户往常的搜索记录，该用户喜欢店铺动态评分大于4.8的商家。</li>
</ol>
<p>最终最终落到搜索服务器的时候，用户的条件已经变成了非常规范化的查询语句:</p>
<pre><code>商品名称: *羽绒服*   //这里的*是通配符，代表商品名称中包含羽绒服的
颜色: black
price: [300000 TO 500000]//单位:分
size: 6
dsr: [4.8 TO *]     //店铺动态评分大于等于4.8的商户</code></pre>
<h3>搜索</h3>
<p>商家上传的上亿商品，会预存在搜索服务器中。</p>
<p>搜索服务器会根据规范化的查询语句，返回该搜索条件命中的结果个数: 共xxx件相关商品。</p>
<p>搜索服务的主体单位是一个doc。在天猫的场景中，就是一个商品。</p>
<p>为了简化问题，对于一个商品来说，限定有如下一些feature：</p>
<ul>
<li>id: 商品id  long</li>
<li>price: 价格 int </li>
<li>saleNum: 销量 int </li>
<li>favNum: 收藏点赞数 int </li>
<li>color: 主要颜色 text {红橙黄绿青蓝紫等等}</li>
<li>size: 尺寸 1-7 分别代表{XS,S,M,L,XL,XXL,XXXL}</li>
<li>itemNum: 库存 int</li>
<li>created_at: 创建时间 long 时间戳表示</li>
<li>dsr: 店铺动态评分 float 范围 2.0-5.0</li>
<li>tag: 标签 text </li>
</ul>
<p>一个规范化的查询条件，可以对于这些feature做一些限定。为了简化问题，本题中的查询条件只会用AND连接各个feature限定，不会出现OR或者NOT等复杂的带有优先级的查询。</p>
<p>举例（该例子为原生的solr语法，详细可以看query_gen产生的output）：</p>
<p><code>(tag:*情侣* OR *双层领*) AND dsr:[3.0 TO 5.0] AND itemNum:[1000 TO *] AND saleNum:[5000 TO *] AND size:1</code></p>
<p>代表标签中含有情侣或者双层领的，店铺动态评分在3.0到5.0的（包括3.0和5.0），库存数量大于等于1000，销量大于等于5000，并且size尺寸为XS的商品。</p>
<p>这里有一个python2.7版本的<a href="/download/item_gen.py">item_gen.py</a>，该文件会生成300w商品的数据文件，以csv的格式给出。</p>
<p>这里有一个python2.7版本的<a href="/download/query_gen.py">query_gen.py</a>，该文件会生成300w查询的条件。</p>
<p>对于每个查询条件，你需要知道它命中了多少个商品。</p>
<p>本题的答案为所有查询的结果的和。</p>
<hr />
<p>这题可以自己写代码解决，但是代码中会有非常多的技巧性的东西，比如<a  target="_blank"  href="http://baike.baidu.com/link?url=go_rxEAzEVk1Fv0QcIOl76ENJoVuZa3PS8nylK3YoCWpIiT2ZCJiioFkxmUQ1WXpSr2iuWdO4fejhm3dJfpHwa">倒排索引</a>，正排索引以及布尔查询的范围查询优化等等。</p>
<p>而搜索问题，真实场景其实比本题提供的query更复杂很多。</p>
<p>目前<a target="_blank" href="https://lucene.apache.org/solr/">apache solr</a>作为世界上最好用最通用的企业级搜索应用，已经经过了数年的磨练和验证，在中国各大公司都有非常广泛的应用。你可以去solr官网仔细阅读教程，把solr搭建起来，然后把300w商品数据导入，根据solr的规范调通查询接口，然后泡杯咖啡，就可以坐等答案了。
<img src="http://121.201.63.168/uploads/145675028559391.jpg" alt="" style="width:100%"/></p>
<p>为了便于大家check和查错，提供前5条查询条件和对应的结果数。</p>
<pre><code>(tag:*拉链* OR tag:*其他*) AND created_at:[1400703171 TO 1442106921] AND dsr:[3.7 TO 4.6] AND saleNum:[8468 TO 20576]
12964

(tag:*纽扣* OR tag:*套头*) AND favNum:[20865 TO 31690] AND created_at:[1354541271 TO 1442674521] AND dsr:[3.2 TO 3.8]
4477

(tag:*其他* OR tag:*森系*) AND price:[9543 TO 19114] AND size:[2 TO 5] AND dsr:[2.4 TO 4.0]
13787

(tag:*宽松* OR tag:*新款*) AND itemNum:[649 TO 11879] AND created_at:[1349185821 TO 1402107621] AND saleNum:[6843 TO 32343]
12183

(tag:*聚酯纤维* OR tag:*OL*) AND saleNum:[8233 TO 21645] AND size:[6 TO 7] AND color:purple
2665</code></pre>',
                    'answer' => 'noanswer',
                    'material' => ' 由于我常年在tmall写mr，python不是写得很好，求大家谅解。另外其实在tmall每个商品有上百个feature，由于这些涉及到公司核心的排序体系，题目中的feature以及数据都是random gen的。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-02-29 20:00:33',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 165,
                    'y' => 405,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 11111,
                ),
            100 =>
                array (
                    'id' => 101,
                    'title' => 'png-1',
                    'content' => '<p>作为一个图片分享网站，in的90%以上的流量消耗来自于图片，如何在不降低清晰度的情况下尽可能压缩图片的大小，是一个图片分享网站永恒的话题。<font color="red">如果把1张1m的图片压缩至500k，那么in每年的服务器流量费用将只有原来的50%，同时还能节约广大用户的移动流量。</font></p>
<p>png全称Portable Network Graphics。是目前非常优秀的图片存储方式，相比于jpeg，其实际占用的存储空间约为jpeg的70%。具体的介绍大家可查阅维基百科：<a target="_blank" href="https://zh.wikipedia.org/wiki/PNG">https://zh.wikipedia.org/wiki/PNG</a>。</p>
<p>关于png格式的压缩，有非常多很有技术含量的工作。在这里先不一一展开。</p>
<p><a target="_blank"  href="https://tinypng.com/">tinypng</a>是一个专业的png图片压缩网站。</p>
<p>以下是tinypng的效果图，一张208.9kb的图片在不降低主体清晰度的情况下被压缩成63.9kb。
<img src="http://121.201.63.168/uploads/145682778166409.jpg" alt="" style="width:100%"/></p>
<p>想要了解这方面的技术细节，首先你需要很清晰的了解<a target="_blank" href="http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm">png格式</a>。</p>
<hr />
<p>下面有一张标准的png图片，因为被我改动了1个byte，他就不能正常显示了。
复原该png图片你就能看到本题的答案了。
<img src="http://www.qlcoder.com/uploads/145682845224096.png" alt="" style="width:100%"/></p>',
                    'answer' => 'noanswer',
                    'material' => '公司目前正在上市路演中，有兴趣的coder欢迎砸简历过来。爱图购 & IN招聘：http://weibo.com/jiuyantechnology',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-01 18:38:07',
                    'updated_at' => '2016-04-25 17:26:17',
                    'author' => '82638883@163.com',
                    'x' => 660,
                    'y' => 440,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 2564,
                ),
            101 =>
                array (
                    'id' => 102,
                    'title' => '序列化',
                    'content' => '<p>在实际工作中，我们经常会用到序列化和反序列化。
关于这方面推荐一个我认为<a target="_blank" href="http://kb.cnblogs.com/page/515982/">讲得比较细致的博客</a>。</p>
<p>对于一个大型网站来说，往往会有上千台服务器。数据结构和对象会在这些服务器之间传递。</p>
<p>考虑一个典型的RPC调用。</p>
<p>A服务器中的应用传递对象给B服务器，B服务器根据A传递的对象参数给出特定的返回值。</p>
<p>因此，在A服务器应用中，会把对象序列化成二进制的流，再通过socket或者http等形式传输到B服务器，B服务器的应用收到二进制流之后，通过反序列化，转换成对象。</p>
<p>上题中的xml和json便是2种比较通用的序列化反序列化方式。</p>
<p>很多语言提供了自己的序列化和反序列化方式。然后实际开发中，由于A服务器中的应用和B服务器中的应用未必是同一种语言(可能一个是php，一个是java)，因此往往需要更通用化的序列化和反序列化方案。</p>
<p>对于一些高性能的场景，往往一次传递的对象数组就非常的巨大。
因此对于序列化和反序列化来说，最重要的2个benchmark的指标是：</p>
<ol>
<li>cpu开销，把对象转成2进制流，并反转成对象的cpu消耗，复杂的序列化协议会导致较长的解析时间，这可能会使得序列化和反序列化阶段成为整个系统的瓶颈。</li>
<li>序列化后用于传输的2进制流的大小。对于海量分布式存储来说数据量往往以TB计算，因此空间开销过大意味着高昂的硬件成本。</li>
</ol>
<p>目前业界公认的，最为优秀的序列化反序列化方案有：google开源的<a  target="_blank"  href="https://developers.google.com/protocol-buffers/">protocol buffer</a>和<a  target="_blank"  href="http://thrift.apache.org">apache thrift</a>和<a  target="_blank"  href="http://avro.apache.org/">apache avro</a>。
以下是它们的benchmark图。</p>
<p>cpu benchmark:</p>
<p><img src="http://121.201.63.168/uploads/145691855993756.png" alt="" /></p>
<p>length benchmark:
<img src="http://121.201.63.168/uploads/145691864092164.png" alt="" /></p>
<p>详细参数请查阅:<a  target="_blank"  href="https://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking">benchmark</a>。</p>
<hr />
<p>在这里，我推荐大家使用protocol buffer。</p>
<p>下面有2个文件：</p>
<ul>
<li>protobuf的<a href="http://121.201.63.168/uploads/145691932573615.proto">消息定义</a></li>
<li>根据该消息定义生成的<a href="http://121.201.63.168/download/145691935645609.data">序列化后二进制文件</a>。</li>
</ul>
<p>当你用protobuf反序列化之后，你会得到一个Task对象，该对象内有一个answer数组。
每一个Answer对象有一个名为data的int型的成员变量。
本题的答案为answer数组中data域的和。</p>',
                    'answer' => '333334000',
                    'material' => 'avro有着更为优秀的性能表现，但其稳定性有待观察。。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-02 19:53:50',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 335,
                    'y' => 260,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 2222,
                ),
            102 =>
                array (
                    'id' => 103,
                    'title' => '协同过滤',
                    'content' => '<p>在推荐系统众多方法中，基于用户的协同过滤推荐算法是最早诞生的，原理也较为简单。该算法1992年提出并用于邮件过滤系统，两年后1994年被 GroupLens 用于新闻过滤。一直到2000年，该算法都是推荐系统领域最著名的算法。</p>
<p>俗话说“物以类聚、人以群分”，拿看电影这个例子来说，如果你喜欢《蝙蝠侠》、《碟中谍》、《星际穿越》、《源代码》等电影，另外有个人也都喜欢这些电影，而且他还喜欢《钢铁侠》，则很有可能你也喜欢《钢铁侠》这部电影。</p>
<p>所以说，当一个用户 A 需要个性化推荐时，可以先找到和他兴趣相似的用户群体 G，然后把 G 喜欢的、并且 A 没有听说过的物品推荐给 A，这就是基于用户的协同过滤算法。</p>
<p>根据上述基本原理，我们可以将基于用户的协同过滤推荐算法拆分为两个步骤：</p>
<ol>
<li>找到与目标用户兴趣相似的用户集合。</li>
<li>找到这个集合中用户喜欢的、并且目标用户没有听说过的物品推荐给目标用户。</li>
</ol>
<p>豆瓣电影是中国最著名的电影sns社区，它允许用户对每部电影进行评价。
<img src="http://www.qlcoder.com/uploads/145734101082773.jpg" alt="" style="width:100%"/></p>
<p>现在从豆瓣的用户中抽取了500左右个比较活跃的用户，这些用户都是忠实的电影迷，大部分人涉猎了上百部电影。</p>
<p>这里有个80多万行的<a href="http://www.qlcoder.com/download/train.txt">文本文件</a>，文件的每行是三个数字，分别是userid，movieid，rating。代表一个用户对一部电影的评分。rating代表评分的星级，如上图中的红框所示，星级从低到高依次是1-5。</p>
<p>接下来有个行数为10001的<a href="http://www.qlcoder.com/download/test.txt">文本文件</a>（第一行为title），文件的每行为2个数字，分别代表userid和movieid，请你预测如果该用户观看了这部电影，会给该电影打多少分，你的预测值为1个大小为1-5的整数。</p>
<p>本题的答案是一个长度为1万的字符串，字符串的第k位代表你对第k行的预测结果。</p>
<p>如果你的预测结果和实际答案的差值的绝对值的和小于6000，通过该题。</p>',
                    'answer' => '',
                    'material' => '由于国内用户数据造假，刷榜刷单的情况特别严重。如果反作弊体系不够完善，这些假数据会严重干扰协调过滤等基于用户行为的算法的效果。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-07 19:11:53',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 287,
                    'y' => 400,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 9090,
                ),
            103 =>
                array (
                    'id' => 104,
                    'title' => 'RPC',
                    'content' => '<p>RPC(Remote Procedure Call，远程过程调用)是建立在Socket之上的,出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用).越底层，代码越复杂、灵活性越高、效率越高；越上层，抽象封装的越好、代码越简单、效率越差。Socket和RPC的区别再次说明了这点。在传统的编程概念中，过程是由程序员在本地编译完成，并只能局限在本地运行的一段代码，也即其主程序和过程之间的运行关系是本地调用关系。因此这种结构在网络日益发展的今天已无法适应实际需求。众所周知，传统过程调用模式无法充分利用网络上其他主机的资源（如CPU、Memory等），也无法提高代码在实体间的共享程度，使得主机资源大量浪费。</p>
<p>通过RPC我们可以充分利用非共享内存的多处理器环境（例如通过局域网连接得多台工作站）,这样可以简便地将你的应用分布在多台工作站上，应用程序就像运行在一个多处理器的计算机上一样。你可以方便的实现过程代码共享，提高系统资源的利用率，也可以将以大量数值处理的操作放在处理能力较强的系统上运行，从而减轻前端机的负担。</p>
<p>上题中介绍的protocol buffer和thrift，都是比较经典的rpc框架，利用protocol buffer，你可以非常快速的部署rpc的服务端，也可以非常方便的编写rpc的客户端。</p>
<p>这是一个protocol buffer的message和service的定义文件。</p>
<p>rpc服务端的服务器的地址为：121.201.8.217，端口号为8090。</p>
<p>该service暴露了一个function <code>getTask</code>，他的入参是<code>TaskRequest</code>，里面的email是你qlcoder上的email。该方法返回值是一个<code>TaskResponse</code>，<code>answer</code>字段为本题的答案。</p>',
                    'answer' => 'noanswer',
                    'material' => '',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-05 23:47:46',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 100,
                    'y' => 30,
                    'contributor' => 1,
                    'study' => '',
                    'score' => 0,
                ),
            104 =>
                array (
                    'id' => 105,
                    'title' => '类型系统-1',
                    'content' => '<p>类型系统-1</p>
<blockquote>
<p>A type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute.</p>
<p>——《Types and Programming Languages》Benjamin C. Pierce</p>
</blockquote>
<p>说到编程语言，就不得不提到类型系统。如果你熟悉Java，那么你肯定理解int和String的差别，并且能够快速的说出一个常量的类型。当你试图将一个String赋值给一个int时，编译器就会告诉你这样的做法是不合法的，因为“String类型不能赋值给int”。这类检查被称为“类型检查”。</p>
<p>所谓类型系统，就是指在一个编程语言当中，用来确定什么样的值可以进行什么样的操作的“规则”，通常要求这种规则具有一致性，并且可以容易的被自动执行。</p>
<p>通常类型系统还有各种不同的分类方法：比如静态类型和动态类型语言，强类型和弱类型语言。从中还引发出了“类型安全”的概念。然而这些并没有什么卵用，只有实践才能出真知。下面举几个编程语言，我们来看看它们的类型系统：</p>
<ol>
<li>C。C语言是一种面向机器的语言。换句话说，为了有效的在C语言的环境中编程，你需要知道你的变量在内存中是如何进行布局的。你可以精细的控制每一个变量的每一个比特，并且可以忽略类型，而将内存中某一个类型的数据，强行当作另一个类型的数据。这被称为是“弱类型”。包含类型：原始类型，指针类型，数组类型，结构类型，枚举类型和联合类型。</li>
<li>C++一开始仅仅是C语言的一个包装。然而通过人们不断完善C++的OOP机制，C++已经变成了非常高级的编程语言了。根据你的风格不同，你可将C++当作各种不同范式的语言。
C++还有在C的基础上的添加的模版类型。在类型理论中，这被称为“参数化多态（Parametric Polymorphism）”。后面的题目将会讨论参数化多态的一些例子。实际上C++的模版是如此之强，以至于你可以在运行时使用模板来进行任何类型的计算。这实际上会导致编译时的一系列困难。
C++包含类型（除C以外）：对结构的扩充（类），引用类型，成员指针。值得一提的是，每个C/C++的类型都可以静态的得到其所占用内存的大小。
C++还包含了只读(const)类型的有趣现象。在新的C++中还有右值引用的神奇特性。</li>
<li>Java。这是一种强类型的语言。它基本上包含了C++的OOP的大部分内容，但是对C++的类型系统进行了简化。它使用一种称为“范型”的参数化多态方案。它仅包含三种可以定义的类型：原始类型、数组和对象。我们有时会使用Java的Enum，但是那并非枚举类型。</li>
<li>C#。这是一个比Java更好的类型系统。它包含两种基本类型：值类型和引用类型。其中值类型可以是结构类型或者枚举类型，而引用类型包括对象、数组和委托类型（函数指针）。在Java中，为了扩充原始类型的功能，引入了原始类型的包装类，然而原始类型和包装类型却不完全兼容，比如原始类型不能作为范型的参数、包装类型可以是null、原始类型和包装类型的数组没有关联等等。在C#中，这种差异完全不存在。你可以继承自一个值类型，甚至可以通过扩展方法，扩充任何一个已经定义的函数。</li>
<li>FORTRAN。这个古老的语言一开始只有原始类型（内部类型）和数组类型，在Fortran 90中加入了结构类型（派生类型）。值得一提的是，FORTRAN会根据变量的名字来猜测类型，这个行为实际上很少见。</li>
<li>众LISP。这是一个很多不同类型的语言的集合，其实并不能当作一种语言。大部分的LISP属于无类型，有些有类型的LISP又各自有不同的类型系统。</li>
<li>Pascal。早期的Pascal包括原始类型、结构类型（记录类型）、枚举类型（自序列类型）、数组类型、集合类型、联合类型和指针类型。后来Object Pascal又加入了对象类型，实际上是结构类型的扩充。</li>
<li>Go。这是一个比较现代的语言，包含了原始类型、结构类型、数组类型、字典类型（map）、切片类型、字符串类型、通道类型、函数类型、接口类型和指针类型（号称简洁其实东西真多。。。）。值得一提的是，Go不支持参数化多态。</li>
<li>Rust。又一个现代语言，包含了原始类型、字符串类型、元组类型（tuple）、数组类型、切片类型、结构类型、抽象数据类型（enum），接口类型（trait）和函数类型。</li>
<li>qll只有整数类型一种。</li>
<li>大量的无类型的语言：JavaScript、Ruby、Python等。注意，类型必须有“语法标记”。运行时的类型不能满足这个条件。然而无类型的语言通常还支持“duck typing”，有时会出现莫名其妙的问题。</li>
<li>强类型的函数式的语言。如Haskell、ML、Scala和各类类型系统特别强的语言。它们值得单独讨论，这里暂时按下不表。</li>
<li>还有其他乱七八糟的语言：Objective-C、Swift、BASIC、PHP、Perl、Tcl、Bash、Forth、sed，这里就不说了。</li>
</ol>
<p>这上
面只提到了类型系统的一半：即语言允许什么样的值存在。还有另一半，即不同类型之间的交互规则。我们可以按这个问题将静态类型语言分成两种不同的类别：</p>
<ol>
<li>声明的类型与运行时类型相一致的语言。</li>
<li>声明的类型与运行时类型不一致的语言。</li>
</ol>
<p>第一种类别包括C、FORTRAN、Go、Rust等等各种不支持继承的语言。尤其是各种强类型的函数式语言。它们更倾向于使用高阶函数、参数化多态、特设多台（Ad-hoc Polymorphism）等等来完成代码重用。</p>
<p>第二种类别包括所有传统OOP的语言：C++、Java、C#等等。这些语言的值的类型并不一定是其声明的类型、而可能是其声明类型的“子类型”。这时就会出现很多奇特的现象，比如有时候你需要cast一个类型。语言还会提供instanceof操作符来判断运行时具体是什么类型。现代软件工程通常认为继承所带来的问题不如它所解决的问题多。所以慎用继承！</p>
<p>当你的语言是上面的第一种类别时，类型系统的规则就比较简单，只需要检查赋值／定义的符号两边是否相等即可，当有函数调用时，可以根据所给的数据类型、判断出某个调用的参数类型是否正确。
当你的语言是上面的第二种类别时，类型系统的规则就要考虑子类性。根据类型理论的研究，当你的类型系统支持继承时、它就不能一致性地支持类型参数（除非加入人为条件）。这就是为什么Java和C#的范型编程和Haskell相比如此之弱。C++则是一个特别的例子。它不仅仅不能一致性的支持类型参数。它的模版特性实际上被称为是“依赖类型”（dependent type）。也就是说，具体的静态类型，还受到静态的值的影响。比如说std::array类型，其第二个参数居然是一个整数。换句话说，仅仅是这一点，你可以写出$2^{64}$个不同的静态类型来，每个的长度都不一样。C++编译器将会分别编译这每个类型，并且生成相应的二进制代码。好在如果你不用某个具体的类型，C++编译器就会直接忽略它的存在。</p>
<h3>类型系统-1</h3>
<p>现在这里有一个假想的语言，我们称之为ik-language，属于不支持子类的类型系统。为了简化问题，我们先忽略参数化多态。</p>
<p>这个语言有下面三个语句：</p>
<ul>
<li>（新类型语句) type A定义一个类型A。</li>
<li>（新变量语句）a := expr 定义一个变量a。</li>
<li>（赋值语句）a = expr 向a赋值。</li>
</ul>
<p>其中expr可以是：</p>
<ul>
<li>（新对象表达式）new A。</li>
<li>（引用表达式）a 引用变量a。</li>
</ul>
<p>下面是类型系统的规则：</p>
<ol>
<li>从上向下检查。只考虑正确的语句。出错的语句可以认为是注释。</li>
<li>每一个变量和表达式都有类型。</li>
<li>不能重复定义一个变量或者类型。否则后使用那个语句出错。</li>
<li>名称不同的类型，是不同的类型。</li>
<li>在一个类型没有被定义以前，不可以通过新对象表达式引用这个类型。</li>
<li>在一个变量没有被定义以前，不可以通过引用表达式或者赋值语句引用这个变量。</li>
<li>如果有a = expr，那么变量a的类型必须是表达式expr的类型。否则语句出错。</li>
<li>新对象表达式new A的类型是A。</li>
<li>引用表达式a的类型是a在新变量语句中所定义的类型。</li>
</ol>
<p>下面是一个1000行的<a href="http://www.qlcoder.com/download/145743685778441.txt">ik-language的源代码</a>，请计算出每个变量的类型。格式为”变量名-类型名-变量名-类型名…变量名-类型名”。其中变量名按照字典序排列。</p>
<p>附加信息：所有的变量名和类型名都由1到15个英文字母组成。并且他们都不是关键字new或者type。</p>',
                    'answer' => 'bpgnd-vbscm-chejl-kwazn-daygi-kwazn-dmajv-kpxwm-dvoyd-kwazn-eehzw-vbscm-ensym-vbscm-enudn-uveul-eybii-gaagz-gaagz-vbscm-jnhno-zocos-jrqjd-kwazn-kpxwm-uveul-krcep-ensym-kwazn-uveul-mzrjt-vbscm-oaqoa-gaagz-opzmc-opzmc-rlrlm-wqhcn-sxyco-oaqoa-tbeyw-kwazn-uat',
                    'material' => '本题主要想让大家了解下语言的基本组成。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-08 19:37:42',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 526,
                    'y' => 40,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 3571,
                ),
            105 =>
                array (
                    'id' => 106,
                    'title' => 'bmp',
                    'content' => '<p>bmp是最标准最易理解的图片存储格式。是windows系统下通用的位图格式。
详情可以看
<a target="_blank" href="https://en.wikipedia.org/wiki/BMP_file_format">bmp file format</a></p>
<p>jpg,png都是采用了图片的有损压缩算法从而达到较大的压缩比。</p>
<p>下有一个标准的bmp格式的图片，但是一般的文件浏览器无法正常的打开它。
当你了解了bmp格式的原理后，相信你可以以正确的方式打开图片，看到答案。</p>
<p><img src="http://121.201.63.168/uploads/145752260153647.bmp" alt="" /></p>',
                    'answer' => 'noanswer',
                    'material' => 'bmp由于格式本身没有任何压缩算法，往往用来保存高清的高质量的无损的大图。在摄影方面运用比较广泛。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-09 19:26:08',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 670,
                    'y' => 500,
                    'contributor' => 6,
                    'study' => '',
                    'score' => 4761,
                ),
            106 =>
                array (
                    'id' => 107,
                    'title' => '类型识别-2',
                    'content' => '<p>通常来说，编程语言中都会涉及函数的概念。
考虑下面这个函数：</p>
<pre><code>int double(int x) {
return x * 2;
}</code></pre>
<p>这个函数接受一个int类型的参数，并且返回一个int类型的值。再比如下面这个函数：</p>
<pre><code>int min(int a, int b) {
return a &lt; b ? a : b;
}</code></pre>
<p>这个函数接受两个int类型的参数，并返回一个int类型的值。我们可以将这个函数的类型记作<code>(int, int) -&gt; int</code>。（这个箭头符号是右结合的）。
我们可以将这个函数换一种写法：</p>
<pre><code>function&lt;int(int)&gt; minf(int a) {
return [a](int b) { return a &lt; b ? a : b; };
}</code></pre>
<p>这里使用了C++11 lambda，我们通过调用minf函数，返回了另一个函数，如果再调用这个函数，就得到了和min一样的结果。但是这时，这个函数的类型就变成了<code>int -&gt; (int -&gt; int)</code>。这告诉我们，所有的多元函数（不包括不带参数的过程）都可以写成A -&gt; B的形式。
现在我们来改进之前的语言ik-language。（应大家要求，我们去掉了赋值语句）</p>
<p>
ik-language 2.0
这个语言有下面两个语句（粗体代表直接出现在源代码中的文字，斜体代表可被替换成具体源代码的符号）：</p>
<p><img src="http://www.qlcoder.com/uploads/145795309917053.jpg" alt="" /></p>
<p>其中expr可以是：</p>
<p><img src="http://www.qlcoder.com/uploads/145795319027217.jpg" alt="" /></p>
<p>最后，type可以是：</p>
<p><img src="http://www.qlcoder.com/uploads/145795327261162.jpg" alt="" /></p>
<p>给出形式定义如下：
词法分析：</p>
<pre><code>* ID ::= [a-zA-Z][a-zA-Z0-9_]*
* TYPE_ID ::= ID</code></pre>
<p>语法分析：</p>
<pre><code>* Program := (Statement)*
* Statement := TypeDecl | VarDecl
* TypeDecl := type TYPE_ID
* VarDecl := ID := Expression
* Expression := \\( ID : TypeSignature ) -&gt; Expression | Expression1
* Expression1 := Expression1 ( ( Expression ) )? | Expression2
* Expression2 := ID | new TYPE_ID | ( Expression )
* TypeSignature := TypeSignature1 -&gt; TypeSignature | TypeSignature1
* TypeSignature1 := TYPE_ID | ( TypeSignature )</code></pre>
<p>其中Program是开始符号。</p>
<p>类型系统的规则，先是ik-language 1.0的规则：</p>
<ol>
<li>从上向下检查。只考虑正确的语句。出错的语句可以认为是注释。</li>
<li>每一个变量和表达式都有类型。</li>
<li>不能重复定义一个变量或者类型。否则后使用那个语句出错。</li>
<li>名称不同的类型，是不同的类型。</li>
<li>在一个类型没有被定义以前，不可以通过新对象表达式引用这个类型。</li>
<li>在一个变量没有被定义以前，不可以通过引用表达式或者赋值语句引用这个变量。（这个规则可以合并到下面作用域的规则里面）</li>
<li>如果有a := expr，那么变量a的类型是表达式expr的类型。</li>
<li>新对象表达式new A的类型是A。</li>
<li>引用表达式a的类型是“最内层作用域中符号a的定义”的类型。</li>
</ol>
<p>接下来是附加的ik-language 2.0规则：</p>
<ol>
<li>假设有\\id : type -&gt;expr。expr（可能带有对id的引用）必须能够在将id当作type时完成类型检查。假设这种情况下其类型是B，那么\\id : type -&gt;expr的类型是type-&gt;B。</li>
<li>如果expr1的类型是A-&gt;B，并且有调用表达式expr1(expr2)，那么expr2的类型必须是A，并且整个调用表达式的类型将是B。</li>
</ol>
<p>有关“最内层作用域中符号a的定义”这一术语，涉及“作用域分析”的内容。这里，ik-language 2.0的规则如下：</p>
<ol>
<li>作用域是一个从“符号”到“定义”的映射。符号是一个名称，而定义是一段代码。</li>
<li>程序的每个部分都属于一个或多个作用域。</li>
<li>作用域“覆盖”程序的某一个连续的区域。如果两个作用域之间，要么一个作用域的覆盖区域完全包含另一个作用域的包含区域；要么两个作用域的覆盖区域不相交（交集为空集）。在这种情况下，所有作用域形成一个有限偏序集，所以对于程序的每个部分，会有它所属的“最内层”的作用域。如果一个作用域A包含另一个作用域B，并且没有任何一个作用域在A和B之间，那么A被称为B的父作用域，B被称为A的子作用域。</li>
<li>程序的一开始有一个空的作用域。</li>
<li>每一个函数\\id : type -&gt;expr 包含在一个覆盖区域为整个函数的“本地作用域”。在这个作用域中，符号id的定义是\\id: type，这个定义的类型是type；其他的符号的定义为本地作用于的父作用域中该符号的定义；。</li>
<li>对于每个新变量语句id := expr，有一个从这个新变量语句结尾到程序结尾的作用域。这个作用域中，符号id的定义是expr，这个定义的类型是expr的类型；其他的符号的定义为本地作用于的父作用域中该符号的定义。</li>
</ol>
<p>这里的例子当然是一个简化的例子，因为我们仅仅讨论了变量的作用域。实际上类型也有作用域。本题的数据中，所有的类型定义语句都被放在了最前面，所以类型的作用域是自然的。在这里就省去不加定义。</p>
<p>下面来看几个例子：</p>
<pre><code>type A
a := new A</code></pre>
<p>这时a的类型是A。</p>
<pre><code>type A
a := \\(f: A -&gt; A) -&gt; f</code></pre>
<p>a的类型是(A-&gt;A)-&gt;(A-&gt;A)。因为f的类型是A -&gt; A，而它返回A -&gt; A。</p>
<pre><code>type A
type B
a := \\(a : A) -&gt; \\(b : B) -&gt; a</code></pre>
<p>a的类型是A-&gt;B-&gt;A。</p>
<p>这里有一个100030行的<a href="http://www.qlcoder.com/download/type.txt">ik-language的源代码.txt</a>，请问其中多少行是合法的。</p>',
                    'answer' => 'noanswer',
                    'material' => '由于我在mtv,晚上8点不能答疑，如果各位有什么问题可以先在学习资料板块留言^_^。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-14 19:37:27',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638882@163.com',
                    'x' => 440,
                    'y' => 25,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 50000,
                ),
            107 =>
                array (
                    'id' => 108,
                    'title' => 'Markov-1',
                    'content' => '<p>阿里巴巴于2012年开始招聘人类学家，社会学家，布局未来30年，展望中国。</p>
<p>我国至今进行过六次全国性人口普查，其中对人口迁移的研究，对制定各项国策有着重要意义。</p>
<p>人口迁移的原因有很多很多:</p>
<ul>
<li>能干的小伙想到沿海城市寻求更好的发展</li>
<li>气候的因素导致大家向往四季如春的昆明</li>
<li>家里被强拆…(咚咚咚，水表)</li>
</ul>
<p>等等等等</p>
<p>阿里在2013年和政府开始紧急合作，其中一个课题，就是预测出5年后各省的人口分布。因为每个人迁移的原因很多很复杂，为了简化问题，人口迁移先不考虑出生、死亡、出国等因素。</p>
<p>数据分析师@小明接到任务后思考良久，决定用标准的<a href="http://baike.baidu.com/link?url=OM-StkCR52lIa7khCkDiueCOtVUuKi54YPASCT2W0jkrt06E3TS71GQgaZP6T1eyrZyBBhe-jCwfXZl98VNrMq">马尔科夫转移矩阵法</a>去建立预测模型。</p>
<p>这里是40w经过脱敏的<a href="http://121.201.63.168/uploads/population_migration.csv">人口迁移样本</a>。</p>
<p>数据共有40万行，每行有3列，分别代表一个中国公民（脱敏后用整数表示），2014年所在省份(用0-30代表省份)，2015年所在省份(用0-30代表省份)。另外，2015年31个省级行政区的初始人数分别为(列表下标为0-30，分别代表每个省的初始人口)(不含港澳台):</p>
<p>[16389723,10262186,20593430,71685839,49425543,88979305,8060519,
68538709,33484131,23071690,41755874,26457769,36884039,56493891,
33397663,42181417,89855501,90028072,52745625,61911446,43970320,
26994017,76207174,33571308,43626674,34462115,24052594,2837769,
5284525,5970133,20802249]</p>
<p>请顺着小明的思路，预测出5年后，即2020年时的各省人数。</p>
<p>提交格式：按上述顺序给出各省人口数，中间用逗号分隔。如，"21,34,124,...,12"。当你和小明的答案的每个省的人口误差和小于500k，通过此题。</p>',
                    'answer' => 'noanswer',
                    'material' => '给隐马尔科夫铺个路...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-15 20:54:01',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 290,
                    'y' => 540,
                    'contributor' => 11,
                    'study' => '',
                    'score' => 5000,
                ),
            108 =>
                array (
                    'id' => 109,
                    'title' => '时间线-2',
                    'content' => '<h3>时间线</h3>
<p>[300字新浪微博的介绍.txt，等待作者上传]</p>
<hr />
<p>在新浪微博的社交网络中，关注是主要的功能。关注是单向的，当你关注了某人，你可以第一时间收到他微博。</p>
<p>新浪第一大v姚晨甚至有7900w的粉丝。意味着当她发表了1条微博之后，接着这7900w用户登陆的时候都需要收到该条内容。是一个非常具有挑战性的工作。</p>
<p>每个用户的动态，由他关注的所有的人产生的微博按时间的倒序组合而成。我们称这个页面为：时间线（timeline），内容以时间为顺序聚合。</p>
<p>维护每个用户的时间线是一项非常有挑战的工作。</p>
<p>当一个大v发表了一条微博，可能影响了上千万个用户的时间线内容。</p>
<p>ok，这里让我们来模拟一下新浪微博的社交网络。</p>
<hr />
<p>在数字王国中，共有1000w个居民，他们的编号分别为1-1000w。数字王国也有一个新浪微博，数字之间的粉丝关系如下 :</p>
<ul>
<li>1是国王，他关注所有数字，也被所有数字关注。</li>
<li>每个数字关注它自己的因数。（举例：12关注2,3,4,6）</li>
<li><font color="red">素数作为一种很神圣的数字，被所有小于他的数关注。（举例：7被1，2，3，4，5，6关注）,这是和上一题唯一的区别</font></li>
</ul>
<p><br>
接下来有一个文件，总共1000w行，是数字王国的新浪微博的操作的历史记录。这里提供该文件的python2.7版本的<a href="http://121.201.63.168/uploads/145813004658861.py">gen.py</a>
每行代表一个数字在微博上的行为，行为分2种，发微博和浏览自己时间线，具体格式如下：</p>
<ul>
<li>p 33 hello     //代表数字33发表了1条微博，内容为hello</li>
<li>v 44      //代表数字44看了自己的时间线</li>
</ul>
<p>对于每个v行为，你需要返回该数字所看到的内容。</p>
<p>举例</p>
<pre><code>p 2 hello     //素数2发表了1条内容为hello的微博
p 2 iloveyou
p 2 heyjuice
v 10          //数字10查看了自己的时间线，由于10关注了2，因此他看到了这3条微博 heyjuice-iloveyou-hello,按时间的倒序陈列
p 2 yoyoyo   
p 5 checknow
v 10          //数字10再次查看了自己的时间线，看到了 checknow-yoyoyo
v 6           //数字6查看了自己的时间线，由于6关注了2，看到了 yoyoyo-heyjuice-iloveyou-hello</code></pre>
<p>对于每个v，你需要记录它的md5值。</p>
<p>因此最终的output是<code>md5("heyjuice-iloveyou-hello")-md5("checknow-yoyoyo")-md5("yoyoyo-heyjuice-iloveyou-hello")="565ba1cd2fc85e4bcbaa7259d2ac677a-4b5408642c9fe94eb110dc93ae1a7278-bd9240c114284ac3510774f042094ce6"</code></p>
<p>本题的答案为output的md5（小写32位）。</p>',
                    'answer' => 'noanswer',
                    'material' => '时间线是一个社交网站最重要的组件，维护好时间线的难度是非常高的，新浪微博发展的这几年，对于时间线模块重构了4次。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-16 20:09:50',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 150,
                    'y' => 470,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 16666,
                ),
            109 =>
                array (
                    'id' => 110,
                    'title' => '时间线-1',
                    'content' => '<p>[300字新浪微博的介绍.txt，等待作者上传]</p>
<hr />
<p>在新浪微博的社交网络中，关注是主要的功能。关注是单向的，当你关注了某人，你可以第一时间收到他微博。</p>
<p>新浪第一大v姚晨甚至有7900w的粉丝。意味着当她发表了1条微博之后，接着这7900w用户登陆的时候都需要收到该条内容。是一个非常具有挑战性的工作。</p>
<p>每个用户的动态，由他关注的所有的人产生的微博按时间的倒序组合而成。我们称这个页面为：时间线（timeline），内容以时间为顺序聚合。</p>
<p>维护每个用户的时间线是一项非常有挑战的工作。</p>
<p>当一个大v发表了一条微博，可能影响了上千万个用户的时间线内容。</p>
<p>ok，这里让我们来模拟一下新浪微博的社交网络。</p>
<hr />
<p>在数字王国中，共有1000w个居民，他们的编号分别为1-1000w。数字王国也有一个新浪微博，数字之间的粉丝关系如下 :</p>
<ul>
<li>1是国王，他关注所有数字，也被所有数字关注。</li>
<li>每个数字关注它自己的因数。（举例：12关注2,3,4,6）</li>
</ul>
<p><br>
接下来有一个文件，总共1000w行，是数字王国的新浪微博的操作的历史记录。这里提供该文件的python2.7版本的<a href="http://121.201.63.168/uploads/145813004658861.py">gen.py</a>
每行代表一个数字在微博上的行为，行为分2种，发微博和浏览自己时间线，具体格式如下：</p>
<ul>
<li>p 33 hello     //代表数字33发表了1条微博，内容为hello</li>
<li>v 44      //代表数字44看了自己的时间线</li>
</ul>
<p>对于每个v行为，你需要返回该数字所看到的内容。</p>
<p>举例</p>
<pre><code>p 2 hello     //素数2发表了1条内容为hello的微博
p 2 iloveyou
p 2 heyjuice
v 10          //数字10查看了自己的时间线，由于10关注了2，因此他看到了这3条微博 heyjuice-iloveyou-hello,按时间的倒序陈列
p 2 yoyoyo   
p 5 checknow
v 10          //数字10再次查看了自己的时间线，看到了 checknow-yoyoyo
v 6           //数字6查看了自己的时间线，由于6关注了2，看到了 yoyoyo-heyjuice-iloveyou-hello</code></pre>
<p>对于每个v，你需要记录它的md5值。</p>
<p>因此最终的output是<code>md5("heyjuice-iloveyou-hello")-md5("checknow-yoyoyo")-md5("yoyoyo-heyjuice-iloveyou-hello")="565ba1cd2fc85e4bcbaa7259d2ac677a-4b5408642c9fe94eb110dc93ae1a7278-bd9240c114284ac3510774f042094ce6"</code></p>
<p>本题的答案为output的md5（小写32位）。</p>
<p>PS:自己发表的微博，不会出现在自己的timeline里，timeline里只陈列关注的人的内容。</p>',
                    'answer' => 'noanswer',
                    'material' => '时间线是一个社交网站最重要的组件，维护好时间线的难度是非常高的，新浪微博发展的这几年，对于时间线模块重构了4次。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2015-12-01 15:15:40',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 220,
                    'y' => 410,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 8333,
                ),
            110 =>
                array (
                    'id' => 111,
                    'title' => '千里语输入法',
                    'content' => '<h1>千里语</h1><p>目前大部分用户已经从pc端向移动移动端的迁移，淘宝60%的流量已经来自移动端。</p><p>对于输入法来说，移动端由于触摸区域变小很多，因此输入法的设计更困难。</p><p>一般的拼音输入法往往采用9键设计，如下图所示。<br>26个字母分布在8个数字中。</p><p><img src="http://121.201.63.168/uploads/145829826126552.png" alt="" title=""></p><p>李世石大战阿法狗，实际的输入序列是: 54744744329426232468</p><p>深入研究发现，总共有四层装换：数字(2-9)-&gt;字母(a-z)-&gt;拼音(many)-&gt;汉字(many)</p><p>可以发现，每层的状态数依次递增：8个数字-&gt;26个字母-&gt;几百个拼音-&gt;上万个汉字</p><p><img src="http://121.201.63.168/uploads/145829936185120.png" alt="" title=""></p><p>九宫格的搜狗输入法，依次点击 636332，输入法给出：么么哒<br>但是又由于2按键和3按键相离较近，很容易按错，当依次点击 636333 时，输入法仍然给出了么么哒的选择</p><p><img src="http://121.201.63.168/uploads/145829934742954.png" alt="" title=""></p><hr><p>现在我们来动手试试如何通过用户输入的数字，预测他实际想要打的字。</p><p>ok，搜狗公司不仅开发中文，英文输入法，还准备通吃全世界的各种语言。</p><p>为了简化模型，这里我们定义一种新的语言，称之为『千里语』，该语言也是由26个字母组成，并且一个字母出现的概率只与前一个字母相关。</p><p>接下来提供2个文件。</p><ul><li><p>第一个文件<a href="http://121.201.63.168/uploads/145835459995807.txt">keyboard.txt</a><br>是千里星人在手机上用搜狗千里语输入法的时候，实际的按键（2-9）和想要打的字母（a-z）的关系。</p></li></ul><p>例子：</p><pre><code>
//每行有三列，第一列为字母，第二列为按键，第三列为次数

a,2,78 //即某用户实际想输入的字母为a按了2的情况出现了78次

a,3,5 //即某用户实际想输入的字母为a按了3的情况出现了5次（这里可能是误操作，用户实际想按2）
</code></pre><p>2第二个文件<a href="http://121.201.63.168/uploads/145835462696852.txt">train.txt</a>是用户通过『搜狗千里语输入法』打出千里语文本记录，该文件共有984行，每行代表一段千里语文本。你可以通过这个数据，了解千里语字母之间的微妙联系。 </p><p>一个千里星人失恋了，在手机上打开记事本记了一段千里语，他的按键序列为  [\'6\', \'3\', \'5\', \'7\', \'5\', \'3\', \'5\', \'4\', \'8\', \'6\', \'4\', \'3\', \'8\', \'6\', \'6\', \'4\', \'5\', \'2\', \'5\', \'3\', \'6\', \'6\', \'2\', \'3\']，<br>本题的答案是该用户实际想要输入的千里语文本。</p><p>举例:</p><p>换算成人类语言<br>比如已知点击按键的序列为[\'6\', \'3\', \'6\', \'3\', \'3\', \'2\']</p><p>预测出的最大可能性的字母序列为[\'m\', \'e\', \'m\', \'e\', \'d\', \'a\']</p><p>即答案为："memeda"。</p>',
                    'answer' => 'zhijiaorenshengsixiangxu',
                    'material' => '继qll之后，千里星人又有自己的自然语言了。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-18 23:04:07',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 290,
                    'y' => 600,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 9090,
                ),
            111 =>
                array (
                    'id' => 112,
                    'title' => '千里码手机',
                    'content' => '<p>对于一个标准的9宫格键盘（如下图所示）来说，输入<code>hello world</code>的顺序是<code>43556196753</code>,这里1代表空格以及标点。</p><p><img src="http://121.201.63.168/uploads/145864754892549.jpg" alt="" title=""></p><p>目前市面上的手机由于键盘布局的原因，都不太适合打字。</p><p>千里码团队准备重新定义手机，千里码手机——自带机械键盘的手机。</p><p>预计明天召开发布会，后天融资，大后天开始量产。</p><p>产品原型机已经开发完毕，如下图所示。</p><p><img src="http://121.201.63.168/uploads/145865509074282.png" alt="" title=""></p><hr><p>该手机的键盘布局如下，</p><pre><code>kb_mp[\'1\'] = [\' \',\'.\',\'!\']  //空格
kb_mp[\'2\'] = [\'q\',\'b\',\'x\']
kb_mp[\'3\'] = [\'z\',\'u\',\'v\']
kb_mp[\'4\'] = [\'g\',\'h\',\'j\']
kb_mp[\'5\'] = [\'m\',\'p\',\'l\']
kb_mp[\'6\'] = [\'f\',\'c\',\'y\',\'t\']
kb_mp[\'7\'] = [\'k\',\'n\',\'r\']
kb_mp[\'8\'] = [\'a\',\'e\',\'w\']
kb_mp[\'9\'] = [\'i\',\'d\',\'o\',\'s\']</code></pre><p>这里有段文本摘自某本书籍，存在食年的千里码手机里，是用千里码键盘撰写的。撰写的过程中按键如下。本题的答案是该书籍主人公的名字。</p><pre><code>648159969691164817828591164816793258587879116481793791584919716481923878149589116481978918491988164974919966878765611648618781796169791961735891187916486148381791789586616971648196863912391169316871239681648511999847881896416485114597966197139596616485118293616481975616497416931687179619919919479781648511286839816486164874816497491164861539416481435871786816978879118791849581995815861988164851891648167836197891188198814879391128683981648158955818491878167836187934416916497716486168716487481648189759187816481978918491991</code></pre>',
                    'answer' => '123456',
                    'material' => '进军手机产业之后，下一个目标就是VR...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-22 21:36:57',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 220,
                    'y' => 580,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 5555,
                ),
            112 =>
                array (
                    'id' => 113,
                    'title' => 'File in File',
                    'content' => '<h3>File in File</h3><p>互联网应用经常需要存储用户上传的图片，比如facebook相册。</p><p>facebook目前存储了2600亿张照片，总大小为20PB，每张照片约为80KB。用户每周新增照片数量为10亿。（总大小60TB），平均每秒新增3500张照片（3500次写请求），读操作峰值可以达到每秒百万次。</p><p>考虑到一台标配的服务器的硬盘是10TB，理论上可以存 10TB/80KB=1.3亿张左右的照片。</p><p>然而linux服务器的文件索引的设计最多只支持500w左右的文件数，如果超过500w，性能会大幅下降。</p><p>在普通的linux文件系统中，读取一个文件包括三次磁盘io:首先读取目录元数据到内存，其次把文件中的inode节点装载到内存，最后读取实际的文件内容。由于小文件个数太多，无法将所有的目录以及文件的inode信息缓存到内存，因此磁盘IO次数很难达到每个图片读取只需要一次磁盘IO的理想状态。</p><p>因此，facebook的图片存储系统haystack设计采用的思路是: 多个逻辑图片文件共享一个物理文件。</p><p>1个物理文件的大小=32MB。因此linux服务器中的文件个数在 10TB/32MB=1024*1024/32=327680..远远小于linux服务器的文件索引的阈值。</p><p>照片文件在物理文件中的存放为依次的顺序存放。每个照片文件的存放规格如下:</p><ol><li><p>1字节的标记位。0代表接下来的照片仍然可用，1代表接下来的照片已经被删除，2代表该物理文件接下来已经没有图片了。</p></li><li><p>4字节的size。标记照片的大小x。</p></li><li><p>x字节，照片文件本身。</p></li></ol><p>这里有一块遵循该规格的<a href="http://www.qlcoder.com/download/rf.data">物理文件</a>,里面存放着诺干张图片，正确的拿到图片即可看到本题的答案。</p>',
                    'answer' => 'Blob',
                    'material' => 'TaobaoFileSystem是比较经典的blob存储系统，如果大家有兴趣可以访问http://tfs.taobao.org。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-25 17:49:13',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638882@163.com',
                    'x' => 870,
                    'y' => 235,
                    'contributor' => 10,
                    'study' => '',
                    'score' => 2631,
                ),
            113 =>
                array (
                    'id' => 114,
                    'title' => 'mysql-分表分页 ',
                    'content' => '<h3>mysql-分表分页</h3><p>mysql是目前用得比较广泛的数据库，广泛到我不想做过多的介绍。</p><p>一个电商网站往往也会用mysql作为数据库存储。</p><p>当插入的数据量大到一定程度，mysql的查询就会变得非常慢，还有一个更严重的问题是，当需要添加一列的时候，mysql会锁表，期间所有的读写操作只能等待。</p><p>因此一个比较常规的解决方案是mysql水平分表。</p><p>考虑以下这张最基本的商品表，仅有2个字段，商品id(id)和商品收藏数(favs)。</p><p><img src="http://www.qlcoder.com/uploads/145925347429059.jpg" alt="" title=""></p><p>当电商网站上的商品数量越来越多，一个比较简单的分表策略就是把items拆分成10张表，<br>分别为items0~items9。</p><p>id%10=0的商品放在items0这张表。<br>id%10=1的商品放在items1这张表。<br>…<br>id%10=9的商品放在items9这张表。</p><p>这样可以解决数据量不断增大的问题，但是随之带来的插入和查询方面的编程复杂度也会上升很多呢。</p><h4>查询1</h4><p>分表前的查询语句:</p><pre><code>//查询id=5的商品
select * from items where id=5;</code></pre><p>这条由于where条件的限定，所以可以直接定位到该数据在第6张表item5。</p><p>分表后的查询语句:</p><pre><code>select * from items5 where id=5;</code></pre><h4>查询2</h4><p>分表前的查询语句:</p><pre><code>//查询收藏数小于10000的商品
select * from items where favs&lt;10000;</code></pre><p>由于分表字段是id，因此当where条件和id无关，必须同时遍历10张表。</p><p>分表后的查询语句</p><pre><code>select count(*) from items0 where favs&lt;10000;
select count(*) from items1 where favs&lt;10000;
...
select count(*) from items9 where favs&lt;10000;

//接下来代码聚合这10条查询结果。。
</code></pre><p>由此可知，当分表之后，mysql查询重写是个非常艰难和复杂的工作。</p><h4>分页</h4><p>电商网站往往有一个商品列表页，并按某种排序逻辑排序。</p><p>假设每页陈列20个商品，按人气排序，人气最高的商品放在最前面。</p><p>那么第1页的20个商品的查询语句如下:</p><pre><code>select * from items order by favs desc limit 0,20;</code></pre><p>第2页的查询语句如下:</p><pre><code>select * from items order by favs desc limit 20,20;</code></pre><p>目前共有100w个items，由于预测到未来商品数据会非常巨大，架构师早早的分成了10张表。<br>分别为item0~item9。</p><p>这题的答案是第23333页的20个商品的收藏数总和。</p><p>为了便于简单实现分页分表查表逻辑,提供1个mysql的<a href="http://www.qlcoder.com/train/mysql?table=5&a=100&b=30">查询接口</a>。有三个参数，返回数据是标准的json格式。</p><pre><code>http://www.qlcoder.com/train/mysql?table=5&amp;a=100&amp;b=30

代表sql语句 select * from items5 order by favs desc limit 100,30</code></pre>',
                    'answer' => '32035630',
                    'material' => '一步一步走向分布式的mysql...',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-29 21:02:11',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 852,
                    'y' => 178,
                    'contributor' => 3,
                    'study' => '',
                    'score' => 8333,
                ),
            114 =>
                array (
                    'id' => 115,
                    'title' => '抓包-2',
                    'content' => '<p>最近又被运营商劫持了，打电话投诉让我保留证据，于是乎我傻傻的截了几个小广告的图作为证据。<br>最后运营商的coder来帮我排查。。『给我看看你的证据。。』 『截图。。？截图能作为证据么？大哥你是不是搞it的？我要的是你抓下来的包。。』</p><p>抓包只是开始，分析才是王道。。</p><p>答案就是这些<a href="http://www.qlcoder.com/download/catch.data">证据</a>里。</p>',
                    'answer' => 'blowin\' in the wind',
                    'material' => '抓包只是开始，分析才是王道。。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-03-31 19:52:11',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 305,
                    'y' => 93,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 1492,
                ),
            115 =>
                array (
                    'id' => 116,
                    'title' => '帧间压缩-1',
                    'content' => '<p>帧间（Interframe）压缩是基于许多视频或动画的连续前后两帧具有很大的相关性，或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息，根据这一特性，压缩相邻帧之间的冗余量就可以进一步提高压缩量，减小压缩比。帧间压缩也称为时间压缩（Temporal compression）。</p><p>帧间压缩之所以有很好的压缩比，是因为一个视频中往往前后两帧大体相似。</p><p>这里有一个<a href="http://www.qlcoder.com/download/cat.zip">压缩后的文件夹</a>，共140张jpg图片。这140张图片来自1段140帧的视频。该视频的帧间压缩效果非常的出色。请按帧的先后顺序还原该视频。<br>第一帧是 <code>D19B.jpg</code>。</p><p>每个文件名有4位的16进制数组成。<br>当你还原了该视频后，请提交1个长度为560的16进制字符串。<br>本题的答案为该字符串。</p>',
                    'answer' => 'D19B42762CBD2EFAD26ECF03DF0942F4C2516ADBF1AB90CAF6A4AE7493AE3C4689138795099471385B550FECE62B52C023955B7AA569AE1079A1DD3815AA523F81BBE15CE2EAB7BE457ACAF1E8788E125C2EFC7D431CE81ACE23080A45E0A319F52C53FAFB46C85C2835D8F5493556D8A79D698AF95FD269B88CED51484DC49',
                    'material' => '如果没有帧间压缩技术，1部标清电影的大小大约在40G。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-05 21:10:14',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 895,
                    'y' => 390,
                    'contributor' => 4,
                    'study' => '',
                    'score' => 16666,
                ),
            116 =>
                array (
                    'id' => 117,
                    'title' => '帧间压缩-2',
                    'content' => '<p>本题为上一题的加强版。唯一的不同就是这个<a href="http://www.qlcoder.com/download/car.zip">压缩文件</a>了,第一张是<code>A0DD3AE.jpg</code>。</p>',
                    'answer' => 'noanswer',
                    'material' => '人肉的各位是时候拿出点技术了。。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-07 19:59:33',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 895,
                    'y' => 440,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 100000,
                ),
            117 =>
                array (
                    'id' => 118,
                    'title' => 'topic model',
                    'content' => '<h3>topic model</h3><p>感谢搜狐网贡献的语料，这里有<a href="http://www.qlcoder.com/download/8000.zip">8000篇文章</a>，属于以下8类中的一类，</p><ul><li><p>1=IT</p></li><li><p>2=健康</p></li><li><p>3=体育</p></li><li><p>4=旅游</p></li><li><p>5=教育</p></li><li><p>6=文化</p></li><li><p>7=军事</p></li><li><p>8=财经</p></li></ul><p>请提交1个长度为8000的由1-8组成的字符串，字符串的第i位为a，代表第i篇文章属于第a类，90%以上的文章分类正确则通过此题。</p>',
                    'answer' => 'noanswer',
                    'material' => '此题数据和判题均已ok',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-07 22:36:07',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 100,
                    'y' => 328,
                    'contributor' => 5,
                    'study' => '',
                    'score' => 100000,
                ),
            118 =>
                array (
                    'id' => 119,
                    'title' => '霍夫曼编码',
                    'content' => '<p>霍夫曼编码被广泛运用在数据压缩和传输中，著名的gzip也用到了霍夫曼编码。<br>各种压缩算法和压缩格式（rar,jpg,png,mp4）等等，都有参考霍夫曼编码的思想。</p><p>关于霍夫曼编码，建议大家仔细阅读<a href="https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81">wiki</a>。</p><p>该wiki的例子中构建了1棵霍夫曼树（带权路径长度最短的二叉树）。</p><p>字母频率如下:</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/b/ba/TABLE1.JPG" alt="" title=""></p><p>其中1种霍夫曼的编码:</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/3/34/TABLE8.JPG" alt="" title=""></p><p>那么英文单词 <code>FORGET</code> 的编码为 <code>0000011001010111</code>（每位代表1个bit）。</p><p>这里有一篇英文文章。</p><p>文章中出现的Symbol和Frequenncy如下:</p><pre><code>(\' \', 100)
(\',\', 7)
(\'.\', 10)
(\'a\', 36)
(\'b\', 3)
(\'c\', 8)
(\'d\', 18)
(\'e\', 42)
(\'f\', 6)
(\'g\', 13)
(\'h\', 40)
(\'i\', 31)
(\'j\', 1)
(\'k\', 3)
(\'l\', 25)
(\'m\', 11)
(\'n\', 36)
(\'o\', 23)
(\'p\', 3)
(\'q\', 1)
(\'r\', 20)
(\'s\', 25)
(\'t\', 45)
(\'u\', 3)
(\'v\', 1)
(\'w\', 14)
(\'x\', 1)
(\'y\', 5)
(\'z\', 1)</code></pre><p>基于以上的频率，@奥利奥构造了1棵霍夫曼树。(PS:该树已丢，粗心的奥利奥找不到了)</p><p>并根据该树对文章进行了编码。编码如下（每位代表1个bit）:</p><pre><code>1001111111100111111010011110110011111000101001110110010111110000110010001110101111011100001011111111001000101010010001010111100110100110011100111000011011000111010011010110011111011110101100011110101100100111111000010110111000010001000010101111011100001011101101010010001111100110101110011101000011001110011100010010110110001110101111001001110001011011100001000100001110100011111010110100101011110000110101111111110110111111110010111111001001001000101011110000100100010101001001011111111001111110100011101011110111000001010111100010011010110111010010010110001101101011001001110001011011100001000100000110111011000110000010101111000100110110001111001101101000100010101001000011010111101000101011110000110001001111011000100111011001001110001011011100001000100000100011110011110011010010001010100100010010011111010010001110001100111001110001111100011110010111101100100111001000110011001110101111010001010110111110110001001000011110100011101011110100100101000110001111101010101101010101011100100111001000110011001110101111010001101100011101001101011110111000001111010100011101011110100011011000010001000101110010011100100011001100111010111101001111110011111000110100111010111000111000111110111111100111000101001010010000110010000111101001011110001110101111010010011011110010010010111111100111010111101000100011101100101111100011101011100011100011111011110000111101001100010100111010111101001001010000110110101111111001110101111010010111111011000101000111010111000111000011011000111110101101010100111010111101000101010011011101111110001101110000101111111100111010111101000101101101111101010010010001110101110001110000110011111001100011000100100101001110101111010011000110110000100110011001111011111100011001111011010110010011100111110000100110110010011001101001100111001110000100011111111101101001000101010010001011111101010111101100000111011110001110101111010010100111011001011111000011011000111010011010111111111001111110111101100000111010110111010100101001110110010111110001000101010010001000010001000011101011110100101001110110010111110010100111011110001001101111011001111011100100011101011110100100010100101011011101110000001110101000110101111010111011011100001110101100110111101100110111101001100110010</code></pre><p>本题的答案在文章里。</p>',
                    'answer' => 'winteriscoming',
                    'material' => '其实图形图像的压缩的很多核心思想都是基于霍夫曼编码演变出来的。',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-11 20:26:58',
                    'updated_at' => '2016-04-25 17:26:18',
                    'author' => '82638883@163.com',
                    'x' => 615,
                    'y' => 237,
                    'contributor' => 2,
                    'study' => '',
                    'score' => 7692,
                ),
            119 =>
                array (
                    'id' => 120,
                    'title' => 'RSA',
                    'content' => '<p>RSA是非对称加密算法中运用最广泛的吧…没有之一了吧...</p><p>科普大师阮一峰有写过rsa的博客。</p><ul><li><p><a target="_blank" href="http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html">RSA算法原理（一）</a></p></li><li><p><a  target="_blank" href="http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html">RSA算法原理（二）</a></p></li></ul><p>我仍然非常建议直接阅读<a  target="_blank" href="https://en.wikipedia.org/wiki/RSA_(cryptosystem)">wiki</a></p><hr><p>奥利奥对外公布的公钥如下:</p><pre><code>modulus=41031587223377599579245988781518671358060455361860183212406274189493280555347897

exponent=65537</code></pre><p>当我想通过openssl发送给奥利奥一条短信<code>hello oreo</code>，整个消息的加密过程如下：</p><ol><li><p>将<code>hello oreo</code>转成ASCII 16进制<code>68656c6c6f206f72656f</code>。</p></li><li><p>将16进制数<code>68656c6c6f206f72656f</code>转成10进制<code>492997048111526447310191</code>。</p></li><li><p>根据rsa的公钥加密 <code>(492997048111526447310191^exponent)mod modulus</code>，得到加密后的10进制数据为<code>14265747587808699658879529236611779550783906062436115433371632983202493546823659</code></p></li><li><p>转为16进制<code>7b338eff988af0dc37655009c3d6793c12447f6d8dc8aa5826e46e9b86d3e2ffeb</code></p></li></ol><p>因此，奥利奥最终收到的信息为<code>7b338eff988af0dc37655009c3d6793c12447f6d8dc8aa5826e46e9b86d3e2ffeb</code>，奥利奥再用自己的私钥解密，便能看到<code>hello oreo</code>了。</p><hr><p>米多一直暗恋着奥利奥，Ta希望自己的信息是私密的，因此也用了奥利奥的公钥进行了加密。</p><p>加密后的信息:<br><code>14a091645d307b8abd8632a1fb83f81e38c1b33d3286ca814a5742bec52c4b06d08</code></p><p>本题的答案为 米多发给奥利奥的信息的明文（标准ASCII信息，无汉字）</p>',
                    'answer' => 'let\'s gaoji',
                    'material' => '据说在不久的将来，量子计算机能秒速破解rsa。不知道之后IT界的安全体系会变成什么样子呢',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-14 19:34:04',
                    'updated_at' => '2016-04-25 17:26:19',
                    'author' => '82638883@163.com',
                    'x' => 100,
                    'y' => 210,
                    'contributor' => 9,
                    'study' => '',
                    'score' => 6250,
                ),
            120 =>
                array (
                    'id' => 121,
                    'title' => '多帧合成',
                    'content' => '<p>安防领域，摄像头监控的主要的高危场景发生在晚上，而晚上由于采光等原因，画面是相当模糊的。<br> 如图所示，该图为摄像头拍摄的录像的单帧画面，犯罪嫌疑人在打架斗殴，但是很难拍摄到面部细节以及衣服图案。</p><p><img src="http://121.201.63.168/uploads/146098687379908.jpg" alt="" title=""></p><p>为了更加突出主体部分，技术人员通过连续多帧的图片，进行多帧合成，从而提高画面的清晰度。</p><p>左右2张图分别是通过多帧合成技术和单帧图片的效果图。</p><p><img src="http://121.201.63.168/uploads/146098727975777.jpg" alt="" title=""></p><p>该技术也使用于拍摄照片的多帧防抖动。</p><p>多帧防抖是纯数字的防抖技术，它的基本原理是，单帧拆成多帧拍摄，然后对齐合成。苹果在早起便采用了该技术，苹果设定的多帧为4帧，举个栗子：假设测光得到了1/20秒，这个值对于一般人来说可能并不安全，会导致手抖，那么多帧防抖机制此时会启动，让摄像头连续拍摄4帧1/80秒的照片，当然，也可能拍摄成4张曝光时间并不等长的照片，然后对齐，对齐示意如图，多帧的交集可以合成一张不抖动的图像。</p><p>------------------------------------------------</p><p>这里有个视频文件，由于太大了放在了百度网盘。</p><ul><li><p>链接: <a href="http://pan.baidu.com/s/1bKZq1K">http://pan.baidu.com/s/1bKZq1K</a></p></li><li><p>密码: autw</p></li></ul><p>该视频文件将一个bmp格式的img以16进制的方式给出。（看了视频就懂了）</p><p>当你了解了多帧合成等相关技术，你就可以看到答案了。^_^</p>',
                    'answer' => 'heheyishengxiao',
                    'material' => '多帧合成初窥门径管中窥豹题',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-18 21:58:41',
                    'updated_at' => '2016-04-25 17:26:19',
                    'author' => '82638883@163.com',
                    'x' => 955,
                    'y' => 390,
                    'contributor' => 8,
                    'study' => '',
                    'score' => 100000,
                ),
            121 =>
                array (
                    'id' => 122,
                    'title' => '千里基 ',
                    'content' => '<p>千里码励志成为中国最大的同性交友网站，因此推出了同性交友子站点千里基。<br>现在开放注册。<a target="_blank" href="http://www.qlcoder.com/train/gayregister">传送门</a></p><p>由于现在社区正在起步阶段，因此注册采用邀请制，由千里码的用户邀请周围的基佬注册。</p><p>注册表单有8项组成:</p><ul><li><p>username 用户名的长度范围在3-7的全英文</p></li><li><p>password:密码少于20位是不安全的</p></li><li><p>re-password: 再次输入密码</p></li><li><p>email:标准邮箱</p></li><li><p>sex: 性别填0 or 1，0代表0，1代表1</p></li><li><p>birthday: 生日是一个8位字符串，举例:19850105</p></li><li><p>推荐人: 你的用户名</p></li></ul><p>为了激励千里基社区的发展，当你推荐了1000个用户注册千里基，此题设为通过。</p>',
                    'answer' => 'hehean',
                    'material' => '防止自动注册的手段不仅仅是验证码',
                    'solvecnt' => 0,
                    'trycnt' => 0,
                    'learncnt' => 0,
                    'created_at' => '2016-04-21 21:44:21',
                    'updated_at' => '2016-04-25 17:26:19',
                    'author' => '82638883@163.com',
                    'x' => 470,
                    'y' => 200,
                    'contributor' => 7,
                    'study' => '',
                    'score' => 50000,
                ),
        );

        $users = User::all()->toArray();


        foreach($tasks as $index=>$task){
            $user = $users[array_rand($users)];
            $task['contributor'] = $user['id'];
            $task['score'] = 100000;
            DB::table('tasks')->insert($task);
        }
    }
}
